volatile 关键字的用法说明

volatile字面翻译为不稳定的,易变的。
一般编译器优化时,如果一个数据已经读取进寄存器,后续会优先从寄存器中取值来减少访问存储时间,但如果此数值会随时变动,结果就会出现错误
以下测试

#include 
int main()
{
    const int v = 0;
    int *vp = (int*) &v; 
    int tmp  = v;
    *vp = 1;
    printf("%d %d\n",tmp,v);
}  

对比一级优化输出

gcc test.c
./a.out
0 1
gcc -O1 test.c
./a.out
0 0

可以看出不优化和优化时结果并不相同。
添加volatile关键字后

#include 
int main()
{
    volatile const int v = 0;
    int *vp = (int*) &v; 
    int tmp  = v;
    *vp = 1;
    printf("%d %d\n",tmp,v);
}  

三级优化输出

gcc -O3 test.c
./a.out
0 1

所以对多线程或常变的数据包括寄存器声明volatile,明确靠诉编译器,此数据不需优化,每次从原位取值。

你可能感兴趣的:(c语言)