Naw*_*waz 17 c++ compiler-construction gcc initialization undefined-behavior
C++标准的第3.9.1/6节说,
bool类型的值是
true或者false.
现在考虑这段代码,
void f(bool b)
{
switch(b) //since b is bool, it's value can be either true or false!
{
case true: cout << "possible value - true"; break;
case false: cout << "possible value - false"; break;
default: cout << "impossible value";
}
}
int main()
{
bool b; //note : b is uninitialized
f(b);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编 F:\workplace>g++ test.cpp -pedantic
跑.输出:
不可能的价值
出乎意料的输出?嗯,不是真的,因为标准在§3.9.1/ 6的脚注中读到:
以本国际标准描述的方式将bool值用作 "未定义",例如通过检查未初始化的自动对象的值,可能会使其表现为既不是真也不是假.
所以不管我编译和运行这个程序多少次,我得到相同的输出:impossible value.但是,如果我稍微更改它 - f()从图片中删除该功能,并将该switch块写入其中main():
int main()
{
bool b; //note : b is uninitialized
switch(b) //since b is bool, it's value can be either true or false!
{
case true: cout << "possible value - true"; break;
case false: cout << "possible value - false"; break;
default: cout << "impossible value";
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
然后我编译并运行这个程序,我没有得到impossible value输出; 无论我重复多少次,我都没有impossible value.
我只是想知道为什么这个突然改变未初始化的bool的行为?
嗯,从语言的角度来看,很清楚:行为是不确定的.我明白这一点.我也明白编译器可以自由地做任何事情.但是,从编译器的角度来看,这对我来说似乎很有趣.什么可以在编译器(即GCC)可能在每种情况下,为什么呢?
我正在使用:g++ (GCC) 4.5.0 - MinGW, on Windows 7 Basic, 64-bit OS.
Kon*_*lph 17
我只是想知道为什么这个突然改变未初始化的bool的行为?
反汇编代码,看看编译器在做什么.
我的猜测:由于该值现在仅在本地使用,因此编译器会完全优化它.由于行为未定义,编译器可以安全地假设任何值,例如false.这是一个非常明显的优化,因为b就编译器而言,值是恒定的,并且整个逻辑switch是冗余的.那为什么要把它放在可执行文件中?
(这里的重点实际上b只是在第二个代码中本地使用,而且即使在未经优化的代码中也会触发更多优化.在编译器可以进行任何此类优化或代码之前,必须先内联第一个代码必须跟踪路径,这不是微不足道的).