Рассмотрим следующий простой код:
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
? Почему это было оптимизировано? Можно ли предотвратить эту оптимизацию без изменения исходного кода?