c语言细节知识点

本文详细解析了Volatile关键字在多线程环境下的工作原理及Offsetof宏在C/C++中获取结构体成员偏移量的方法,同时探讨了C语言中static关键字的使用场景,包括作用域控制、全局变量管理和默认值设定。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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,以免与一般静态变量或对象相混淆;
 由于可能多包含文件头问题:一般在头文件中不会定义变量,只声明变量;



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值