-O启用编译(静态constexpr数据成员)

时间:2018-10-17 20:12:08

标签: c++ optimization c++14 constexpr static-members

我感到奇怪的是,通过启用优化功能,某些代码会“编译”,否则不会“编译”。在这里,我的意思是(通过“编译”)经历编译的所有阶段并创建一个可执行文件(即包括链接)。考虑以下代码:

struct A { static constexpr int i{0}; };
int main() {
    const int *p = &A::i;
    return *p;
}

此代码完全可以被g ++ -std = c ++ 14 -O1接受,但是如果我传递-O0,则链接器会抱怨缺少符号(正如我预期的那样)。我可以看到优化器如何告诉它不需要那些符号,但是让我感到奇怪的是,一个实际上失败了,而另一个成功了。这是编译器的故意行为吗?它是某种“设计技术”吗?是否有可能“强迫”编译器不发出这些符号(例如,对于嵌入式环境)?

任何见识都会受到赞赏。

我正在使用gcc 7.3.0

0 个答案:

没有答案