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

C++ GCC:在调试构建中优化的静态数据成员,c++,gcc,debug-information,C++,Gcc,Debug Information,考虑以下简单代码: 模板 结构基{ 静态constexpr int v=0; }; 派生结构:基{}; int main(){ 导出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>} 如果Base不是模板类,则GCC也可以看到

考虑以下简单代码:

模板
结构基{
静态constexpr int v=0;
};
派生结构:基{};
int main(){
导出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>}
如果
Base
不是模板类,则GCC也可以看到此输出:

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

d.v
去了哪里?为什么它被优化了?是否可以在不修改源代码的情况下阻止此优化?

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


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

您永远不会访问该值,它不会被引用。为什么它应该成为任何代码的一部分?在这里您可以看到整个程序只是一个
返回0,所以一切都被优化了。
constepr
值应该是编译时常量,因此除非您使用它们,否则无需将其保留在生成的代码中。@mch,对于clang也是如此,但是使用clang,我仍然可以看到
d.v
@mch的值。你确定它不在其中吗?尝试使用
-O0-g-fkeep static consts
进行编译,但我仍然得到
。我能够重现你所拥有的,但我没有任何运气将其分配给0。愚蠢的一点是,如果我将顶级全局int初始化为零?没有优化它。正是由于处于这种结构中,不可能不进行优化
(gdb) p d
$1 = {<Base> = {static v = 0}, <No data fields>}