c++ - "undefined-ness"修改 const 值的机制

标签 c++ pointers constants undefined-behavior constantfolding

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

我看不出常量变量a 的地址有什么特别之处。我验证了 &ab 是相同的,所以编译器没有巧妙地指向其他位置。 然而,当我分配 *b 时,const 值没有改变。

我没有优化运行。当我使用 -g 标志进行编译以调试并单步执行代码时,我得到了预期的结果(变量 a 的内存位置发生了变化)。然而,下面显示的代码并未反射(reflect) a 的更新值。

这是不是即使在 Debug模式下,temps 现在也被放置在寄存器中,没有优化?

#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;
}

最佳答案

这也是undefined behavior在 C++ 中,我们可以通过转到 C++ 标准草案部分 7.1.6.1 The cv-qualifiers paragraph 4 看到这一点,它说:

[...]any attempt to modify a const object during its lifetime (3.8) results in undefined behavior.

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

godbolt 的快速实验使用 -O0 所以没有进行优化表明编译器只是使用 15 的字面值 a 而不是从内存中检索它并且打印出来:

movl    $15, %esi   #,

所以编译器正在执行 constant folding因为它假设因为 a 是常量,所以它可以在它看到 a 的任何地方使用值 15。这是完全合理的,因为你告诉它 a 是常量。

关于c++ - "undefined-ness"修改 const 值的机制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26291427/

相关文章:

C 指针 - 很好的教程

c++ - 创建我自己的 Qt 组件/小部件/工具的方法

c++ - 将 -Wtype-limits 与类型通用代码一起使用

c++ - 在 C++ 中实现默认值

c++:尝试使用const成员构造类

c++ - 在 C++ 中使用 const 的正确方法是什么?

c++ - C++ 中成员函数的 const& 、 & 和 && 说明符

c++ - C++ 中抽象类作为类型,派生类作为实例

c - 在 C 中定义相互引用结构

c - 段错误(核心转储)——如何修复我的代码?