Рассмотрим эти две структуры (юридический C ++ 11 и более поздние):
struct A {
unsigned int a = 5;
} a;
struct B {
unsigned int b;
B() : b(5) {}
} b;
Насколько я понял, , a
и b
должны давать абсолютно одинаковыеcode.
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
См. Код на кресте .То, что компилирует g ++, эквивалентно этому:
struct C {
unsigned int c;
C() { c = 5; } // initialize + assign
} c;
, чего я не ожидал, особенно потому, что я компилирую с -O3
.Это «ошибка оптимизации»?