GCC: член статических данных оптимизирован в сборке отладки - PullRequest
0 голосов
/ 30 октября 2019

Рассмотрим следующий простой код:

template<typename T>
struct Base {
    static constexpr int v = 0;
};

struct Derived : Base<int> {};

int main() {
    Derived d;
}

Я компилирую его с помощью GCC (8.3.0, 9.1.0, g++ -g -O0 test.cpp), затем запускаю GDB, чтобы проверить значение d:

(gdb) p d
$1 = {<Base<int>> = {static v = <optimized out>}, <No data fields>}

d.v пропало ... Я попытался использовать -ggdb, -ggdb3, -fvar-tracking безуспешно.

Если я скомпилирую с помощью clang (clang++ -g -O0 test.cpp), Я вижу ожидаемый результат:

(gdb) p d
$1 = {<Base<int>> = {static v = 0}, <No data fields>}

Этот вывод также отображается в GCC, если Base не является шаблоном класса:

(gdb) p d
$1 = {<Base> = {static v = 0}, <No data fields>}

Куда пропал d.v? Почему это было оптимизировано? Можно ли предотвратить эту оптимизацию без изменения исходного кода?

1 Ответ

0 голосов
/ 30 октября 2019

Несмотря на то, что оно не должно уважать это, используя constexpr и предоставляя инициализированное значение, вы настоятельно намекаете компилятору, что он должен постоянно сгибать Base :: v.

Gcc имеет флаг -fkeep-static-consts, который может делать то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...