【问题标题】:How to prevent optimizing away static const如何防止优化掉静态常量
【发布时间】: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&lt;TRAITS&lt;1&gt;&gt;::x1吗?
  • @immibis (gdb) print foo >::x1 $1 =
  • 我的猜测是,如果您使用 odr-use 变量,它就无法被优化掉 see this question

标签: c++ g++


【解决方案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]];

【讨论】:

    猜你喜欢
    • 2017-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-14
    相关资源
    最近更新 更多