【发布时间】:2023-03-22 23:21:01
【问题描述】:
是否可以使用编译器命令行选项来防止静态 const 成员优化?
这是一个例子:
template <unsigned v1>
struct TRAITS {
static const unsigned val1 = v1;
};
template < class TRAITS >
struct foo {
static const unsigned x1 = TRAITS::val1;
};
int main () {
foo<TRAITS<1>> f1;
// SET BREAKPOINT HERE
return 0;
}
编译:
g++ -g -O0 optimize_out.cpp
GDB:
gdb a.out
(gdb) break optimize_out.cpp:13
(gdb) r
(gdb) p f1
$1 = {static x1 = <optimized out>}
这段代码的特殊之处在于类是模板。可能 C++ 标准中有一些东西会强制编译器优化字段,即使使用 -O0 ? 当我不使用模板时,值不会被优化掉:
struct foo {
static const unsigned x1 = 1;
};
在这种情况下,我可以在调试器中看到 x1
【问题讨论】:
-
你试过
print foo<TRAITS<1>>::x1吗? -
@immibis (gdb) print foo
>::x1 $1 = -
我的猜测是,如果您使用 odr-use 变量,它就无法被优化掉 see this question