修改const值的“不确定性”机制

多夫

我读过,在某些C标准中(可能是99吗?)未定义,修改const时会发生什么。但是一个学生向我提供了一些代码,我对其进行了修改。

我看不到有关常量变量地址的任何特殊信息a我验证了这一点,&a并且b两者相同,因此编译器没有巧妙地指向其他位置。但是,当我赋值时*bconst值不会改变。

我没有进行优化。当我使用-g标志进行调试并进入代码时,我得到了预期的结果(变量的内存位置发生了a变化)。但是,下面提供的代码不能反映的更新值a

现在是否在没有优化的情况下,甚至在调试模式下也将临时文件放置在寄存器中?

#include <iostream>

using namespace std;

int main(){
    const int a = 15;
    cout << a << '\n';
    int * b= (int*)&a;
    cout << &a << "\n";
    cout << b << "\n";
    *b = 20;
    cout << *b << '\n';
    cout << a << '\n';

    int x = a;
    cout << x << '\n';
    x = *b;
    cout << x << '\n';
    return 1;
}
沙菲克·雅格莫(Shafik Yaghmour)

这也是C ++中未定义的行为,我们可以通过转到C ++标准草案7.1.6.1 的cv-qualifiers4看到这一点

在其生存期(3.8)内修改const对象的任何尝试都会导致未定义的行为。

未定义的行为意味着结果是不可预测的,这实际上意味着任何结果都是可能的,即使乍一看违反直觉的结果也是可能的。

使用Godbolt进行的快速实验,-O0因此没有进行任何优化,表明编译器只是使用文字值15a而不是从内存中检索它并打印出来:

movl    $15, %esi   #,

因此,编译器将执行常量折叠,因为它假定a常量是常量,因此可以15在看到的任何地方使用该值a这是完全合理的,因为您告诉过它a是恒定的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章