const和volatile你真的懂了么?
如果想知道 const和非const变量/对象/指针之间的赋值问题 可以查看,本篇只要对比一下const
关键字和volatile
关键字的区别。
const
:const修饰的数据类型是指常类型,常类型的变量或对象的值是不能被更新的。
volatile
:叫做易变关键字,但是实际的作用是不要让CPU优化代码,而是确保每一次数据一定是从内存中取用的,而不是从CPU中直接取用,这就保持了内存的可见性。
下面在Linux上使用 gcc 4.8 来看一看被volatile
修饰过后代码底层的变化。
1.不加volatile
关键字,也就是编译器可以对代码进行优化
#include <stdio.h>
int pass = 1;
int main()
{
while(pass){}
return 0;
}
gcc test.c -O2 -g // 以O2级别进行代码优化
objdump -S -d a.out > a.s // 将反汇编代码重定向到a.s文件中
vim a.s // 查看a.s文件
2.加volatile
关键字,也就是编译器不能对代码进行优化
#include <stdio.h>
volatile int pass = 1;
int main()
{
while(pass){}
return 0;
}
gcc test.c -O2 -g // 同样以O2级别进行代码优化
objdump -S -d a.out > b.s // 将反汇编代码重定向到b.s文件中
vim b.s // 查看b.s文件
结论: volatile 忽略编译器的优化,保持内存可见性。
如果一个变量同时被const
和volatile
修饰,到底是变得易变了,还是不可以被修改了?
const volatile int num = 10;
const
是要求不能对变量上的空间内存中写入,而volatile
是保证每一次读取数据的时候都会从内存中取。这两者没有什么关系,所以就不会冲突了。