我读过,在某些C标准中(可能是99吗?)未定义,修改const时会发生什么。但是一个学生向我提供了一些代码,我对其进行了修改。
我看不到有关常量变量地址的任何特殊信息a
。我验证了这一点,&a
并且b
两者相同,因此编译器没有巧妙地指向其他位置。但是,当我赋值时*b
,const值不会改变。
我没有进行优化。当我使用-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;
}
这也是C ++中未定义的行为,我们可以通过转到C ++标准草案7.1.6.1
的cv-qualifiers第4段看到这一点:
在其生存期(3.8)内修改const对象的任何尝试都会导致未定义的行为。
未定义的行为意味着结果是不可预测的,这实际上意味着任何结果都是可能的,即使乍一看违反直觉的结果也是可能的。
使用Godbolt进行的快速实验,-O0
因此没有进行任何优化,表明编译器只是使用文字值15
,a
而不是从内存中检索它并打印出来:
movl $15, %esi #,
因此,编译器将执行常量折叠,因为它假定a
常量是常量,因此可以15
在看到的任何地方使用该值a
。这是完全合理的,因为您告诉过它a
是恒定的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句