volatile 如何与 const 一起工作?
How does volatile work with const?
我有这段代码,和往常一样,变量 "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.
的功能
编辑- 从所有答案看来,我的代码含糊不清,任何输出都是不可预测的,因为我正在调用未定义的行为。
在 C++ 中,更改通过指针声明为 const 的对象的值 - 就像您在此处所做的那样 - 会导致未定义的行为,这意味着任何东西都可以发生了,你会看到什么完全没有保证。
在第一种情况下,您看到了存储在 const 变量中的原始值,但它可能很容易返回显示不同的值。我的猜测是编译器识别出该变量是 const,缓存了该值,然后将其硬编码到程序集中(尽管我不能确定)。
在第二种情况下,我的猜测是编译器识别出该变量是可变的,因此没有缓存内容,因为它无法假设程序外部的某些内容会更改该值。但是,您仍然不能假设这将适用于多个编译器或操作系统。
编译器不会警告您有关 C 样式转换的信息:
int *ptr = (int*)&local;
这个:
*ptr = 100;
是未定义的行为。
所有这些都与 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.
的功能编辑- 从所有答案看来,我的代码含糊不清,任何输出都是不可预测的,因为我正在调用未定义的行为。
在 C++ 中,更改通过指针声明为 const 的对象的值 - 就像您在此处所做的那样 - 会导致未定义的行为,这意味着任何东西都可以发生了,你会看到什么完全没有保证。
在第一种情况下,您看到了存储在 const 变量中的原始值,但它可能很容易返回显示不同的值。我的猜测是编译器识别出该变量是 const,缓存了该值,然后将其硬编码到程序集中(尽管我不能确定)。
在第二种情况下,我的猜测是编译器识别出该变量是可变的,因此没有缓存内容,因为它无法假设程序外部的某些内容会更改该值。但是,您仍然不能假设这将适用于多个编译器或操作系统。
编译器不会警告您有关 C 样式转换的信息:
int *ptr = (int*)&local;
这个:
*ptr = 100;
是未定义的行为。
所有这些都与 volatile
完全无关。