У gcc отсутствует возможность оптимизировать списки инициализаторов ctor? - PullRequest
2 голосов
/ 27 июня 2019

Рассмотрим эти две структуры (юридический 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.Это «ошибка оптимизации»?

1 Ответ

1 голос
/ 27 июня 2019

Ответ - просто «да», но стоит упомянуть причину, по которой это разрешенная оптимизация.Реализация может инициализировать что-либо статически , если она может доказать, что определенные побочные эффекты не возникают в неправильное время в результате.Этот анализ может быть сложным, и, вероятно, именно поэтому GCC здесь не беспокоится.

...