volatile字面意思:易变的。在计算机里,是防止优化的意思,然而是怎么防止优化的呢?待我一一道来哦。
先看这样一个例子:
<span style="font-size:18px;">#include<iostream>
using namespace std;
int main()
{int num = 10;int *p = #*p = 20;cout<<num<<endl;getchar();return 0;
}</span>
结果是什么呢?
由于p取得是num的地址,即p指向num,然后*p即取出p指向的内容,将它修改为20,所以结果输出num也被修改为20.
我们再看一个例子:
<span style="font-size:18px;">#include<iostream>
using namespace std;
int main()
{const int num = 10;int *p = (int*)#*p = 20;cout<<num<<endl;getchar();return 0;
}</span>
这里只是在int前加了const,将num设定为常量(在c语言中加const修饰变量叫常变量,c++中const修饰变量叫常量),所以无法修改num的值,结果如下:
这里我详细说明一下它是怎么执行的?调出内存看一下吧:
这是num所在的位置。赋值为10.
此时p就指向num。
内存里边p指向的内容确实改变了。但是我们看一下输出的结果:(如果在linux下演示的话,将代码编到test.c下,用命令gcc test.c -02 使优化级别最高进行测试)
为什么输出的结果却是10呢?p所指向的内容确实是num,但是在这里*p改变了,num却不受影响。。这个原因就在于const关键字。const将num这个变量修饰为常量,所以无法修改它,为了使常量不受破坏,就把它放在了寄存器中。以方便使用。又因为寄存器是不编址的,所以取地址根本不受影响。说起寄存器,看一下下面这幅图:(画的不错,网上抠下来的哈)
显而易见,最上边的是寄存器,是速度最快的,最下边是内存,是速度最慢的。那么问题来了,既然寄存器这么快,为什么不把变量都放在寄存器里呢。首先,学过计算机组成原理的同学都知道,寄存器造价高,空间小,可经不起那样的伤害。所以我们尽可能的把它们放在内存中,内存的空间大小可比寄存器的大多了。
为了解决上面的问题,我们引来了另一个关键字:volatile。
volatile是这样使用的。
#include<iostream>
using namespace std;
int main()
{volatile const int num = 10;int *p = (int*)#*p = 20;cout<<num<<endl;getchar();return 0;
}
这样,volatile会防止编译器的优化,保证内存的可见性。也就是不将num放入寄存器,而是放在内存中,这样就可以找到它的地址,进而修改它了。
结果是:
以上就是volatile的简单介绍,希望能对大家的认识有所帮助哦,欢迎来访~~