【发布时间】:2017-04-04 15:12:32
【问题描述】:
我想查看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是optimized out,它的值也应该是随机的吧?
【问题讨论】:
-
未定义的行为是未定义的。所以这里发生的事情是完全不可重现的或以任何形式代表...你只是扼杀了你的程序的合法性,因为整个程序现在是未定义的。跨度>
-
不,没有人向您保证这将是随机的。大多数情况下,您会看到前一个用户在该存储位置(内存或寄存器)中留下的“前一个”值。至少在很短的时间范围内,它可以是相当确定的。
标签: c++ gcc compiler-optimization