c++ - "optimized out"值是否应该是随机的?

标签 c++ gcc compiler-optimization

我想看看gcc的优化选项对程序有什么影响,代码是这样的:

#include <iostream>

class A {
public:
        A() {
                a[0] = 10;
                a[1] = 20;
                empty;
        }
        int a[5];
        bool empty;
};

int main(void){
        A a;

        std::cout << a.empty << std::endl;
        return 0;
}

由于 empty 成员没有在构造函数中赋值,我希望它是一个随机值。编译运行:

# g++ -g test.cpp
# ./a.out
254
# ./a.out
254
# ./a.out
253
# ./a.out
253

结果如我所料。然后我使用 -O2 编译选项:

# g++ -g -O2 test.cpp
# ./a.out
0
# ./a.out
0
# ./a.out
0
# ./a.out
0

似乎总是 0。我使用 gdb 来调试程序:

14      int main(void){
(gdb) n
17                      std::cout << a.empty << std::endl;
(gdb) p a
$1 = {
  a = {[0] = 10, [1] = 20, [2] = <optimized out>, [3] = <optimized out>, [4] = <optimized out>},
  empty = <optimized out>
}

我只是想确定既然 empty优化掉了,它的值也应该是随机的,对吗?

最佳答案

我理解您为什么认为它应该是随机的,但您要求的是具有具有某些特征的垃圾值。换句话说:您希望定义未定义的行为。对不起,但你不能要求那个!当您对世界上所有计算机进行平均时,它是随机的。不是在你的小笔记本电脑上的特定小程序上。这与为什么 random errors 的原因相同。在一台计算机上不容易被发现,因为它们在多台计算机上的多次使用中是随机的。

关于c++ - "optimized out"值是否应该是随机的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43199536/

相关文章:

arrays - 为什么汇编代码在加总和之前将值从 %edx 复制到 %rcx?

c++ - 从捕获的值变量分配给 Lambda 参数时出现 gcc 编译器段错误

c - 为什么使用 -Os 编译会使这个函数变大?

c++ - 检测 fork() 中的子进程创建

c++ - 警告 : cast increases required alignment

c++ - C++ 中以另一个模板类作为参数的构造函数

linux - 最小核心转储(堆栈跟踪+仅限当前帧)

c++ - Boost 序列化和 MFC : "cannot open file ' libboost_serialization-vc141-mt-s-x32-1_69. lib'"

c++ - 三角矩阵转换和自动并行化

c# - 编译器什么时候优化我的代码