-fno-elide-constructors是否包含在-O0或任何其他-O [other level]中?

在我看来,-fno-elide-constructors是优化标志,而-O是优化级别。因此,某些-O级别可能包含标志-fno-elide-constructors。
我对吗?

换句话说,-fno-elide-constructors和-O ..之间是否有任何关系?

最佳答案



是的,尽管有一个非常简单的关系,但是存在一种关系:gcc很可能会在-O0级别取消构造函数,除非您明确禁用它。请参见底部的示例代码以获取证明。

但是,这很棘手,编译器确实可以做讨厌的事情,请参阅RVO force compilation error on failure。底线是:您始终需要检查生成的程序集,以了解引擎盖下实际发生的情况。

请记住(from Working Draft, Standard for ProgrammingLanguage C++, N3797是我能找到的最接近C++ 14的近似值):



证实我的陈述的代码:

#include <cstdio>
constexpr int size = 1024;

struct A { int array[size] = { 0 }; };

int main() {
  A a = A();
  std::printf("%d\n", a.array[size-1]);
}

使用g++ -std=c++11 -Wall -O0 -S elide.cpp,在生成的汇编代码中只有一个
    call    A::A()

但是,通过g++ -std=c++11 -Wall -O0 -fno-elide-constructors -S elide.cpp我得到:
    call    A::A()
    [...]
    call    A::A(A&&)

即使您禁用了-O0的优化,如果出于某种原因需要禁用省略,您仍然必须另外禁用省略。

09-11 18:14