考虑以下两个结构(合法的C ++ 11及更高版本):
struct A {
unsigned int a = 5;
} a;
struct B {
unsigned int b;
B() : b(5) {}
} b;
As far as I understood,a
和b
应该产生完全相同的代码。
clang(8.0.0)符合我的期望,并生成以下程序集:
a:
.long 5 # 0x5
b:
.long 5 # 0x5
g ++(9.1)似乎错过了这种优化机会:
_GLOBAL__sub_I_a:
mov DWORD PTR b[rip], 5
ret
b:
.zero 4
a:
.long 5
See the code on godbolt。 g ++编译到的内容与此等效:
struct C {
unsigned int c;
C() { c = 5; } // initialize + assign
} c;
这是我不希望的,尤其是因为我使用-O3
进行编译。这是“优化错误”吗?
答案 0 :(得分:1)
答案只是“是”,但这是允许的优化的原因值得一提。如果该实施可以证明在错误的时间不会发生某些副作用,则允许实施initialize anything statically。这种分析可能很复杂,这可能就是为什么GCC在这里不打扰的原因。