Volatile关键在于两个地方:
在本次线程内,当读取一个变量时,为提高存取速度,编译器优化时有时会先把变量读取到一个寄存器中;以后再取变量值时,就直接从寄存器中取值;
当变量值在本线程里改变时,会同时把变量的新值copy到该寄存器中,以便保持一致
当变量在因别的线程等而改变了值,该寄存器的值不会相应改变,从而造成应用程序读取的值和实际的变量值不一致
当该寄存器在因别的线程等而改变了值,原变量的值不会改变,从而造成应用程序读取的值和实际的变量值不一致
Offsetof是C语言的一个宏;(size_t)&(((s*)0)->m)
求一个结构体的偏离量:(s *)0 是骗编译器说有一个指向类(或结构)s的指针,其值为0
&((s *)0)->m 是要取得类s中成员变量m的地址
由于这个类(或结构)的基址为0,这时m的地址当然就是m在s中的偏移了
C语言: static用法
1:为了控制作用区域
2:全局变量控制
放在静态区域的数据变量只有:全局变量,static变量 (如果没有初始化,编译器都为他们赋默认值)
3: static 有默认之值:如果是整形:默认0 字符串:‘/0’
如:
void main(){
static int a;
static char b[10];
}
C++:static
在加上C的作用外
1.静态成员函数不能为虚函数
因为静态成员是没有this的,并且它是编译已经确定了
2.子类继承父类的static变量(也可覆写掉)
3.初始化在类体外进行,而前面不加static,以免与一般静态变量或对象相混淆;
由于可能多包含文件头问题:一般在头文件中不会定义变量,只声明变量;