volatile如何与const一起工作?

时间:2017-08-29 21:10:13

标签: c++ pointers const volatile

我有这个代码,像往常一样,变量“local”的值保持不变,因为它是 const

const int local = 10;
int *ptr = (int*)&local;
printf("Initial value of local : %d \n", local);
*ptr = 100;
printf("Modified value of local: %d \n", local);

虽然,当我将local设置为 const volatile 时,它会将local的值更改为100.为什么会这样?

const volatile int local = 10;
int *ptr = (int*)&local;
printf("Initial value of local : %d \n", local);
*ptr = 100;
printf("Modified value of local: %d \n", local);

我理解volatile的唯一含义是它阻止编译器对该变量进行优化,以防它的值必须由外部元素更改。但我无法弄清楚 volatile 如何以及为什么会覆盖 const 的功能。

编辑 - 从所有答案看来,我的代码含糊不清,任何输出都是不可预测的,因为我正在调用未定义的行为。

2 个答案:

答案 0 :(得分:7)

在C ++中,通过指针更改声明为const的对象的值 - 就像您在此处所做的那样 - 导致未定义的行为,这意味着绝对可以发生任何事情对你所看到的一切都毫无保证。

在第一种情况下,您看到了存储在const变量中的原始值,但是可以很容易地返回显示不同的值。我的猜测是编译器认识到变量是const,缓存了值,然后将其硬编码到程序集中(虽然我无法确定)。

在第二种情况下,我的猜测是编译器认识到变量是易变的,因此没有缓存事物,因为它不能假设程序外部的东西会改变值。但是,您仍然无法假设这将适用于多个编译器或操作系统。

答案 1 :(得分:4)

编译器并没有警告你关于c风格的演员表:

*ptr = 100;

这样:

volatile

未定义的行为

所有这些根本不与{{1}}有关。