【发布时间】:2019-11-09 08:37:24
【问题描述】:
考虑这两个结构(合法的 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 编译。这是一个“优化错误”吗?
【问题讨论】:
-
哪个 gcc 版本?如果您使用 {} 语法也会发生这种情况,即:“struct A { unsigned int a{5}; } a;” ?
-
只有当行为明显不同于标准要求时,它才会是一个“错误”,而事实并非如此。编译器优化是实现的质量问题,而不是所有编译器都需要做同样的事情。在比较 clang 和 g++ 时,可以肯定的是,每个都比另一个更好地支持某些优化。
-
@Peter 我更新了我的问题......当然,我不是在谈论原始意义上的错误,更多的是在失去优化机会的意义上!谢谢指出
-
@MartinHierholzer 我已经更新了问题并添加了版本号。它在godbolt链接中也可见!感谢您指出!顺便说一句:有趣的是,g++ 在使用
{}语法时也有问题......这是一个已知问题吗? -
奇怪的是,如果您实际使用这些对象,看起来两个编译器都会为
B和C使用 zero-then-mov route。
标签: c++ c++11 g++ compiler-optimization clang++