【问题标题】:mechanism for "undefined-ness" of modifying the value of a const修改 const 值的“未定义”机制
【发布时间】:2014-10-10 03:19:54
【问题描述】:

我已阅读,在某些 C 标准中它是未定义的(可能是 99?)当 const 被修改时会发生什么。但是一个学生给了我一些代码,我修改了。

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

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

这是不是即使在调试模式下,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;
}

【问题讨论】:

  • 所以您承认这是未定义的行为,但随后您问为什么它的行为不像您预期​​的那样(不管是什么)?根据定义,“未定义的行为”意味着该行为不必有意义。
  • 我希望如果我写入一个内存位置,并且如果一个变量代表那个内存位置,那么我会成功地创建一个错误。如果代码经过优化并将值放在其他地方(如寄存器),那么我会理解这种机制。我想询问变量的地址并没有真正得到尊重,因为它是 const。
  • 我们看到很多关于 SO 的未定义行为问题,我认为社区有时对它们的反应是不幸的。这不是一个典型的问题,有时像Deep C presentation does 这样在引擎盖下达到顶峰可以提供信息。

标签: c++ pointers constants undefined-behavior constantfolding


【解决方案1】:

这也是 C++ 中的 undefined behavior,我们可以通过查看 C++ 标准草案草案 7.1.6.1 cv-qualifiers 段落 4 看到这一点:

[...]任何在 const 对象的生命周期 (3.8) 期间对其进行修改的尝试都会导致未定义的行为。

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

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

movl    $15, %esi   #,

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-27
    • 1970-01-01
    • 1970-01-01
    • 2021-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多