日常开发笔记总结(十四)

文章来源于网络,略有修改,引用参考文末链接。

引子

我们知道,std::vector之所以可以动态扩容,同时还可以保持顺序存储,主要取决于其扩容复制的机制。当容量满时,会重新划分一片更大的内存区域,然后将所有的元素拷贝过去。

但是笔者却发现了一个奇怪的现象,std::vector扩容时,对其中的元素竟然进行的是深复制。请看示例代码:

#include <iostream>

#include <vector>

struct Test {

Test() {std::cout << "Test" << std::endl;}

~Te......

日常开发笔记总结(十三)

向Linux登录终端发消息

同一台服务器,可能有很多个用户登录在上面,每个用户都是一个系统终端,可以向其他终端发送消息,同在服务器上开发的开发人员可以简单的互动(不能回复)一下哈!

一,效果

先登录一个终端,如下:

[root@localhost /]# who

root tty1 2013-02-16 18:14 (:0)

root pts/0 2013-02-17 02:01 (:0.0)

[root@localhost /]#

登录的终端为pts/0。然后再打开一个终端,如下:

[root@localhost ......

日常开发笔记总结(十二)

可以直接在命令行中定义函数,通过使用declare命令来打印出来,使用shell函数,只需要在命令行中输入函数名称。一旦不再需要某个shell函数,可以使用unset命令来删除它。

[root cplusplus]#foo() { echo "Inside function"; }

[root cplusplus]#foo

Inside function

[root cplusplus]#declare -f foo

foo ()

{

echo "Inside function"

}

[root cplusplus]#unset foo

[root cplusplus]#declare ......

日常开发笔记总结(十一)

git命令使用

新工作中由于是在linux环境上写代码,因此原来使用小乌龟提交代码的方式不再适用,因此利用空余时间学习git命令行的使用。

命令行向github推送代码,先在github上创建了仓库:

echo "#hello,world" >> README.md

git init

git add README.md

git commit -m "first commit"

git branch -M main

git remote add origin git@github.com:52coder/hello-world.git

git push -u origin ......

日常开发笔记总结(十)

面试总结专题

用户态到内核态转换

操作系统的进程空间可分为用户空间和内核空间,它们需要不同的执行权限。其中系统调用运行在内核空间。

从用户态切换到内核态主要有如下几种方式:

1.系统调用

在电脑中,系统调用(英语:system call),指运行在用户空间的程序向操作系统内核请求需要更高权限运行的服务。系统调用提供用户程序与操作系统之间的接口。大多数系统交互式操作需求在内核态运行。如设备IO操作或者进程间通信。

2.异常

页缺失(英语:Page fault,又名硬错误、硬中断、分页错误、寻页缺失、缺页中断、页故障等)指的是当软件试图访问已映射在虚拟地址空间中,但是目前并未......

日常开发笔记总结(九)

deprecated用法

一个可运行的demo:

#include <iostream>

// [[deprecated]]

#if __cplusplus >= 201402

# define CPP_DEPRECATED [[deprecated]]

#else

# define CPP_DEPRECATED [[gnu::deprecated]]

#endif // __cplusplus >= 201402

CPP_DEPRECATED

void add(int a,int b);

void add(int a,int b)

{

in......

日常开发笔记总结(八)

下列程序编译是否会报错:

// directive_1.c

#include <stdio.h>

#ifndef MIN

#define MIN(x, y) ((x) > (y) ? (y) : (x))

#endif /**/x

int main()

{

printf("min val = %d\n", MIN(100, -1));

return 0;

}

讲道理程序endif后面有个多余的x应该会编译失败,可是程序编译仅仅有个告警,运行正常。

[root c++]#gcc -g -Wall -o gcc gcc.c

gcc.c:6:12: warn......

日常开发笔记总结(七)

5月份迎来了今年最忙的一个时期,看mbp本周屏幕使用时间仅55分钟,今天难得不用跑装修相关的事情,得以坐在书桌前,随手翻几页书。

函数指针数组

//seq_array是个数组,内放函数指针

const vector<int *> (*seq_array[])(int) = {

fibon_seq, lucase_seq, pell_seq,

triang_seq, sequare_seq, pent_seq

};

这里其实可以使用typedef进行优化:

typedef const vector<unsigned int>* (*pfunc)(int);......

日常开发笔记总结(六)

信号安全函数

进程捕获到信号并对其进行处理时,进程正在执行的正常指令序列就被信号处理程序临时中断,它首先执行该信号处理程序中的指令。如果从信号处理程序中返回,则继续执行在捕获到信号时进程正在执行的正常的指令序列。有如下三类函数不能在信号处理程序中调用(非信号安全函数)

a)已知它们使用静态数据结构(如getpwnam函数)

b)它们调用malloc或free函数

c)标准I/O函数,标准I/O库的很多实现都以不可重入的方式使用全局数据结构。这里需要特别说明一点,书上或网上一些例子,信号处理函数中调用了printf,这里仅仅为了直观说明程序的运行,printf不能在信号处理函数中调用。

......

日常开发笔记总结(五)

周末在家收拾东西,找到一本刚入职时记的笔记,重新读一遍记录部分内容方便查阅。

获取下标为n的元素地址

当时记录在笔记本上旁边有个大大的问号,为何不使用下标形式呢?

#include <stdio.h>

//获取下标为n的元素地址

#define ELEM_PTR(base,n,esize) ((void *)(((char *)base + n*esize)))

int main()

{

int arr[] = {1,2,3,4,5,6,7,8,9,10};

printf("address of fifth elem = %p.\n",ELEM_PTR(arr,5,4......