volatile
介绍
volatile 是指从内存中读取变量数据,防止编译器在处理过程中进行优化。 可以与const连用,例如只读状态寄存器,可以与指针连用,例如:中断服务子程序修改一个指向buffer的指针。
用途
中断服务程序提供给子程序的检测的变量
多任务系统运行时候共享的变量。
存储器映射的硬件寄存器也要加,一般来说不同的读写意义不一样。
在多线程中使用的变量,可以使用volatile,但是不建议用,一般建议使用锁或者原子操作。如果了多个线程使用一个变量的时候,如果不使用volatile。可能这个变量在内存中,也可能被加入到寄存器中,这样使用的不同变量。使用volatile 意思是让编译器每次操作该变量的时候一定要从内存中取出,不使用寄存器中的值。
assert
介绍
assert 一个宏,不是函数,它原理是执行expression 计算表达式,如果出错或者返回0.首先给std::err输出错误,其次再执行abort 终止程序运行。
注意点
如果大量使用assert 则会影响性能,当然用户可以在#include<assert.h>之前加上#define noexcept 即可终止使用assert 判断。
如何让asset(p!=null)在编译期就使用。 char size_should_be_same[sizeof(int) == sizeof(value) ? 1:-1];或者static_assert 或者
template<size_t x>Foo ;
template<>Foo<0>{};
Foo<sizeof(int)-sizeof(value)>bar
sizeof
介绍
sizeof 是一个运算符,是指在代码编译的时候进行的数据结构的大小计算,跟具体的对象没有多大的关系,涉及到字节对齐,一般来说和编译器的实现有关,sizeof 对结构体的计算有以下几个特点:
大小是子成员中的整数倍,如果计算的结果不是整数倍则会填充字节进行补齐。
子成员的偏移是相对于结构体首地址的自身大小的整数倍。如果与需要会在成员之间填充字节。
结构体的首地址是子成员变量中最大的整除。
注意点
- 如果在结构体中还有结构体,则将子结构体的整体拆开打散,进行总的计算。c++ 中的空结构体的大小不为0,而是1。
- sizeof 和 strlen 的区别,strlen 是函数 计算 char 变量的长度,一般char 最后加上一个’\0’;
- 另外strlen 是在运行的时候计算出来。sizeof 使用的是类型作为参数,strlen 使用的是char * 作为参数。
inline
介绍
关于inline,inline 是在编译阶段进行处理,由编译器将函数整体替换到调用函数所在函数点的位置,避免了出栈和压栈,一般来说是简单的函数,比如成员函数。
注意点
- 除了虚函数外,用户可以自己指定函数为inline函数,但是决定权在于编译器,像分支,循环,递归之类不能作为inline 函数
- inline 函数也会影响到性能问题。多次调用,会出现多个副本,增加了更多的内存。
- 和define 相比,多了类型检查,真正具有函数特性,define执行在预处理阶段,inline 在编译阶段,宏有的时候具有两意性,另外宏不能把传递类型参数。