0

考虑以下简单代码:

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

4

1 回答 1

0

即使它不必尊重它,通过使用constexpr和提供一个初始化值,你也强烈暗示编译器它应该对 Base::v 进行常量折叠。

Gcc 有一个-fkeep-static-consts 标志,可以做你想做的事。

于 2019-10-30T08:18:19.137 回答