考虑这两个结构(合法的 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
进行编译。这是“优化错误”吗?
最佳答案
答案只是"is",但值得一提的是允许优化的原因。允许执行 initialize anything statically如果它能证明某些副作用不会因此发生在错误的时间。该分析可能很复杂,这大概就是 GCC 不在此处费心的原因。
关于c++ - gcc 是否错过了优化 ctor 初始化列表的机会?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56789066/