我写了一段简单的对比代码并分别用vs2017以release方式编译然后用IDA观察汇编代码,如下图所示:
代码1
int a=5;
printf("%d",a)
代码2
volatile int a =5;
printf("%d",a);
左边是代码1的汇编代码,右边是代码2的汇编代码。
左边由于 编译器发现a的值是5,然后printf里面有一个a,然后根据等量代换直接就把a的值设置为5了。其实这是一种优化手段,能执行一句代码为什么要执行两句代码呢,是吧。
右边由于给a加上了volatile关键字,就是告诉编译器不要把这个变量优化掉了,该从哪里取数据就从哪里取数据。由于5这个数是存放在了[ebp-4]这个地址开始的内存单元处,所以传递参数的时候也是直接把这个地址的数据给传递进去了。
所以volatile关键字的意思就是 ,教练,请不要优化我啊。