如何防止优化远离静态const

ran*_*dom 8 c++ g++

是否可以使用编译器命令行选项来防止静态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;
}
Run Code Online (Sandbox Code Playgroud)

编译:

g++ -g -O0 optimize_out.cpp
Run Code Online (Sandbox Code Playgroud)

GDB:

gdb a.out
(gdb) break optimize_out.cpp:13
(gdb) r
(gdb) p f1 
$1 = {static x1 = <optimized out>}
Run Code Online (Sandbox Code Playgroud)

这段代码的具体内容是类是模板.可能在C++标准中有一些东西迫使编译器优化字段,即使使用-O0?当我不使用模板时,值不会被优化:

struct foo {
    static const unsigned x1 = 1;
};
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我可以在调试器中看到x1

Jon*_*ely 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;
};
Run Code Online (Sandbox Code Playgroud)

或者,您可以添加静态变量的外线定义(如果您使用它们,则无论如何都需要)并将属性添加到这些定义中:

template < class TRAITS >
  const unsigned foo<TRAITS>::x1 [[gnu::used]];

template <unsigned v1>
  const unsigned TRAITS<v1>::val1 [[gnu::used]];

Run Code Online (Sandbox Code Playgroud)