考虑以下简单代码:
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>}
Base
如果不是模板类,则使用 GCC 也会看到此输出:
(gdb) p d
$1 = {<Base> = {static v = 0}, <No data fields>}
去哪儿了d.v
?为什么优化出来了?是否可以在不修改源代码的情况下阻止这种优化?