GCC:在调试构建中优化的静态数据成员

GCC: static data member optimized out in the debug build

本文关键字:优化 静态 数据成员 构建 调试 GCC      更新时间:2023-10-16

考虑以下简单代码:

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去了哪里?为什么要进行优化?是否可以在不修改源代码的情况下阻止这种优化?

即使它不必尊重它,但通过使用constexpr并提供初始化值,您强烈暗示编译器它应该常量折叠Base::v。

Gcc有一个-fkeep-static-consts标志,它可能会执行您想要的操作。