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文件
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hkwa9xFr-1628850152552)(C:\Users\张昊宇\AppData\Roaming\Typora\typora-user-images\1628848909522.png)]](https://i-blog.csdnimg.cn/blog_migrate/6170ad4bb6f84afa9cfd6f981b1d06ca.png)
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文件
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ErVzn9IA-1628850152554)(C:\Users\张昊宇\AppData\Roaming\Typora\typora-user-images\1628848968627.png)]](https://i-blog.csdnimg.cn/blog_migrate/9d6dedae215346e61a43931d911ab557.png)
结论: volatile 忽略编译器的优化,保持内存可见性。
如果一个变量同时被const和volatile修饰,到底是变得易变了,还是不可以被修改了?
const volatile int num = 10;
const是要求不能对变量上的空间内存中写入,而volatile是保证每一次读取数据的时候都会从内存中取。这两者没有什么关系,所以就不会冲突了。
本文探讨了C++中const和volatile关键字的区别和作用。const用于定义常量,防止值被修改,而volatile则指示编译器每次从内存中读取变量值,避免优化导致的问题。通过Linux上的gcc4.8编译并反汇编代码,展示了volatile如何影响编译器优化。当变量同时被const和volatile修饰时,它依然是不可修改的,但保证了每次读取的可见性。
1385

被折叠的 条评论
为什么被折叠?



