C 语言 volatile 关键字

《C Primer Puls》 是这样解释关键字的:关键字是C语言的词汇,由于编译器不具备真正的智能,所以你必须用编译器能理解的术语表示你的意图。
volatile关键字告诉编译器该变量是易变的,无非就是希望编译器去注意该变量的状态,时刻注意该变量是易变的,每次读取该变量的值都重新从内存中读取
使用GCC编译器时,在编译命令加入 -On ; n : 0 ~ 3,数字代表优化等级,数字越大,优化级别越高。
例如:
gcc -O2 -O hello hello.c 使用 O2 优化级别编译 hello.c

使用GCC编译器生成汇编gcc -S -o main.s mian.c

点击查看代码
int i = 10;
int main(void){
int a, b;
a = i;
...//伪代码,里面不含有对 a 、 b 以及 i的操作
b = i;
if(a == b){
printf("a = b");
}
else {
printf("a != b");
}
return 0;
}
如上代码,如果选择编译器优化,可能会被编译成如下代码(当然不是在C语言层面上优化,而是在汇编过程优化,只是使用C程序举例):
点击查看代码
int i = 10;
int main(void){
int a, b;
a = i;
...//伪代码,里面不含有对 a 、 b 以及 i的操作
b = i;
printf("a = b");
return 0;
}
因为在仅仅从main主函数来看,a == b是必然的,那么在什么情况,a 和 b不是必然相等呢?
  1. i 是其他子线程与主线程共享的全局变量,其他子线程有可能修改 i 值;

  2. i 是中断函数与主函数共享的全局变量,中断函数有可能修改 i 值;

  3. i 属于硬件寄存器,CPU可能通过硬件直接改变 i 的值(例如寄存器的标志位)

————————————————
版权声明:本文为CSDN博主「ora___」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_38815998/article/details/102840096

posted @   zkx98  阅读(59)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示