volatile和const关键字一样,是一个类型修饰符,表示变量可以被编译器的某些未知因素修改,比如操作系统,硬件,某些线程等。遇到这个关键字声明的变量,编译器访问该变量的代码将不再进行优化,以提供对特殊地址的稳定访问。
有代码如下:
int i = 10;
int j = i;//语句1
int k = i;//语句2
这时候编译器进行代码优化,因为在语句1和语句2中,i不作为左值,编译器认为i的值没有发生变化,所以在语句1中将i的值取出赋给j之后i的值并未丢弃,而是在语句2中继续赋给k编译器不会产生汇编代码重新从i里面取值,这样做提高了效率,但是要注意,语句i要没有用作左值才行。而且编译器只在release模式下才对内存进行优化,在debug模式下volatile不会对内存进行优化。
有代码如下:
int i = 1;
int j = i;
int k = i;
volatile int a = 10;
volatile int b = a;
volatile int c = a;
debug模式下的汇编代码:
int i = 1;
010D17BE mov dword ptr [i],1
int j = i;
010D17C5 mov eax,dword ptr [i]
010D17C8 mov dword ptr [j],eax
int k = i;
010D17CB mov eax,dword ptr [i]
010D17CE mov dword ptr [k],eax
volatile int a = 10;
010D17D1 mov dword ptr [a],0Ah
volatile int b = a;
010D17D8 mov eax,dword ptr [a]
010D17DB mov dword ptr [b],eax
volatile int c = a;
010D17DE mov eax,dword ptr [a]
010D17E1 mov dword ptr [c],eax
volatile变量和普通变量的汇编代码没有区别,可见在debug模式下编译器没有进行内存优化。
release模式下汇编代码:
int i = 1;
int j = i;
int k = i;
volatile int a = 10;
01011006 mov dword ptr [a],0Ah
volatile int b = a;
0101100D mov eax,dword ptr [a]
01011010 mov dword ptr [c],eax
volatile int c = a;
01011013 mov ecx,dword ptr [a]
01011016 mov dword ptr [c],ecx
原文链接: https://www.cnblogs.com/lzmfywz/archive/2013/05/11/3073394.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/87992
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!