-fno-elide-constructors是否包含在-O0或任何其他优化级别中?

时间:2014-01-12 02:17:54

标签: c++ gcc optimization c++11

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

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

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

1 个答案:

答案 0 :(得分:2)

  

换句话说,-fno-elide-constructors之间是否存在关系   和-O ..?

是的,有一种关系,虽然这是一个非常简单的关系:gcc很可能已经处于-O0级别的elide构造函数,除非你明确禁用它。请参阅底部的示例代码以获取证据。

虽然这很棘手,编译器可以做很多讨厌的事情,请参阅RVO force compilation error on failure。底线是:你总是需要检查生成的程序集,看看幕后发生了什么。

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

  

12.8 / 31当满足某些条件时,允许实现省略类对象的复制/移动构造,即使为复制/移动操作选择的构造函数和/或对象的析构函数具有副作用。 [...]


证明我的陈述的代码:

#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禁用优化,如果由于某种原因需要将其禁用,您仍需要另外禁用elision。