1、volatile
- 中断服务程序中为其他程序服务的变量用volatile。
当变量触发某中断发生修改后,而编译器判断主函数没有对变量进行修改,可能只会执行一次内存对寄存器的读操作,后面只会对该寄存器副本进行读取,导致中断操作形成短路 - 多任务环境下的多任务操作,用volatile
在线程A下,变量会被编译器写入到一个寄存器副本,之后再读取将只会从该寄存器副本读取。在内存变量或寄存器变量在其他线程操作下变化,线程A使用变量仍然从该寄存器副本读取导致与实际值不一致 - 存储器映射的硬件寄存器需要volatile
编译器会对指令进行优化,如对寄存器写1、写2、写3。编译器会省略写1、写2,直接写3,然而指令这么些有实际意义,使用volatile,不会对其进行优化
2、static
- 被static修饰的变量,只会初始化一次,存放在静态区,被其他函数调用,不会更改其属性
- 在多次函数调用中,函数使用完静态变量,不会释放其内存,其他函数仍然读取该静态区值
- 被声明的变量或函数,作用域为声明处到文件末之间可以使用
3、extern
声明的函数或变量可以被其他文件访问
4、const
const作用
- 声明变量只读,保护不被修改
- const修饰的变量只有一份拷贝,只分配一次内存
- 提高效率,编译器不为普通const分配内存,存在符号表,使其成为编译器的常量
const使用
- 编译器把const变量替换成对应的值
- const修饰引用,引用的变量不能修改
- const和指针
const int* p=&a:常量指针。这是个指针,不过指向的是常量。指针是变量,可以指向其他地址
int* const p=&a:指针常量。这是个常量,不过是指针,因为这个指针是常量,不能被赋值
5. new/delete和malloc/free
- new/delete是C++的操作符,而malloc/free是C中的函数。
- new进行两步,一为分配内存,二为调用类的构造函数
delete进行两步,一为调用类的析构函数,二为释放内存
malloc和free只是分配和释放内存 - new建立的是对象,返回带类型的指针,malloc只是内存,返回void指针
new通过对象成员访问内存,malloc可以直接访问内存
6. strlen和sizeof
srelen:字符串长度,任何一个字符串末尾隐藏一个“\0",字符串结束的标志
sizeof:一个运算符,计算所占空间字节的大小
srelen(“/0”)=0
sizeof(“/0”)=2——/0为一个字节,"“会隐藏一个/0,所以”/0"实际上有2个/0