是否可以使用编译器命令行选项阻止静态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
答案 0 :(得分:1)
您可以使用used
属性告诉编译器发出定义,即使任何东西都不需要它:
template <unsigned v1>
struct TRAITS {
static const unsigned val1 [[gnu::used]] = v1;
};
template < class TRAITS >
struct foo {
static const unsigned x1 [[gnu::used]] = TRAITS::val1;
};
或者,您可以添加静态变量的脱机定义(如果您经常使用它们,则仍然需要)并将属性添加到这些定义中:
template < class TRAITS >
const unsigned foo<TRAITS>::x1 [[gnu::used]];
template <unsigned v1>
const unsigned TRAITS<v1>::val1 [[gnu::used]];