常识便条 1

常识便条 1

1. 可重入函数:
     即可以被中断的函数。可以在这个函数执行的任意时刻中断它,转入OS调度去执行另一段代码,而返回控制时不会出现什么错误。

2. restrict关键字:修饰指针
     表示只能通过它限定的指针访问该指针所指向的对象。

3. register关键字:
     声明一个寄存器变量,用来提高存取速度。
     注:是否真的会放入寄存器,视情况而定。

4. static关键字:
     用来声明一个静态变量。
     例如:stati int tmp; // 声明了一个静态变量tmp,但未定义。

5. /dev/null: linux黑洞

6. set命令:
     显示所有本地定义的shell变量。
     unset命令:
     清除某个变量的定义。

7. 溢出、越界、泄漏的区别
     溢出:放入某个已分配好的空间过多的内容。
     越界:访问位置超过已分配好的空间。
     泄漏:申请的空间未得到正确释放。一般是new或malloc的空间未用delete或free释放。

8. explicit关键字:
     主要用于修饰构造函数,指明构造函数只能显示的使用。防止不必要的隐式转换。

9. 浅复制,深复制
     浅复制:
      char *p =(char *) malloc(10);
      strcpy(p, "abcd");
      char *q = p;   // 浅复制

     深复制:
      char *p =(char *) malloc(10);
      strcpy(p, "abcd");
      char *q = malloc(strlen(p));
      strncpy(q, p, strlen(p)); // 深复制

10. 类模版的声明与定义。
     类模板的声明与定义分别放在.h头文件和.cpp源文件中:
     在编译时,模版并不能生成真正的二进制代码,而是在编译调用模板类或函数的cpp文件时,才会去找对应的模板声明和实现。
     在这种情况下,编译器是不知道实现模板类或函数的cpp文件的存在。所以它只能找到声明,但找不到实现。 
     编译器只好创建一个链接符号寄希望于链接程序找到该模板类或函数的实现地址。
     而又知道,模板类或函数的实现并不能被编译成二进制代码,结果链接程序也找不到地址,只好报错了。

     两种解决办法:
     1). 将类模版的声明和定义放在同一个文件中
     2). 在.h中包含.cpp。例如:
     // .h文件
     #ifndef __XXX_H__
     #define __XXX_H__
     .....
     #include "XXX.cpp" // 包含源文件,该文件的最后位置
     #endif

     // .cpp文件
     #ifndef __XXX_CPP__
     #define __XXX_CPP__
     #include "XXX.h" // 包含头文件,该文件的最前位置
     ....
     #endif

11. telnet连接某个端口:
     telnet ip port
     例如:telnet 127.0.0.1 80

12. gdb 简单使用查找段错误位置
     $ulimit -c 1024  或者 $ulimit -c 2048  // 设置core文件大小
     $gdb exe-file core.xxx
     $bt
     ......

13. 编译c++文件
     gcc xxx.cpp -lstdc++ -o xxx
     gcc xxx.cpp -I /usr/local/include -L /usr/local/lib -llibxxxx -o xxx

14. 一些锁机制:
     互斥量,读写锁,条件变量,信号量

15. 分离线程:分离线程不被其它线程(父进程或init进程)所等待,运行结束后,线程就终止了,马上释放系统资源。
     使用方法:
     phtread_t tid;
     pthread_attr_t attr;
     pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
     pthread_create(&tid, &attr, Thread_func, (void *)data);

16. size_t与ssize_t
     size_t 一般是unsigned int,无符号类型,用来指示内存大小、数组下标等
     ssize_t 一般是signed int,有符号类型,用来表示返回值,可能为负值。

17. volatile关键字:修饰变量
     每次使用该变量时,都需要从内存中读取,修改之后马上写入内存,而不是使用cache中的值。(编译器不对其进行优化)。

18. 类成员函数中const的使用
     放在函数参数表与函数体之间:
     例如:
     void func(....) const;
     指明该函数不可以修改该类的任何成员变量。
     如果在编写该const成员函数时,不慎修改了数据成员,或者调用了非const成员函数时,编译器就会报错。
     这大大提高了程序的健壮性。

     另:任何不会修改数据成员的函数都应该声明为const类型。

19. shmdt函数:用来断开共享内存附加点的地址,禁止本进程访问此片共享内存。
     另共享内存其它函数:shmget, shmat, shmctl
     YY: shmat与shmdt有点儿类似于open与close的味道。

20. 后台运行
     nohup ./xxx.exe &

你可能感兴趣的:(学习)