|
发表于 2024-3-19 00:16:42
|
显示全部楼层
百度了一下,“volatile的变量是说这变量可能会被意想不到地改变” 我个人理解是对它的访问不做优化,对内存变量才有效,应该是编译器级别的约定(又如static 的变量会被解释成全局变量)。
函数的返回值在eax中,将忽略volatile。
小例:均启用/Ox优化- #include <stdio.h>volatile int myfun(int n){ n=n+2; return rand(n);}void main(){ volatile int i=10; //int i=10; int a,b,c; a=i; b=i; c=i; printf("i=%d\n",a); printf("i=%d\n",myfun(4));}
复制代码 片段:- mov DWORD PTR _i$[esp+4], 10 //imov eax, DWORD PTR _i\$[esp+4] //amov ecx, DWORD PTR _i\$[esp+4] //bmov edx, DWORD PTR _i\$[esp+4] //c
复制代码 四次访存,未优化。
若改为 int i=10;则有
a=i;
b=i;
c=i;
因未实际使用,已全被忽略。
以上对于函数返回值加与不加无影响,均为
push eax
push OFFSET \$SG2233
call _printf
总之,volatile 针对存变量,每次访存的话就不一定保存数据一致性了,且volatile 会影响全局优化。
有误之处请指正,也是才接触,似乎面试中常考,解释的也很玄。 |
|