-fno elide构造函数是否包含在-O0或任何其他优化级别中

Is -fno-elide-constructors contained in -O0 or any other optimization level?

本文关键字:其他 任何 优化 -O0 构造函数 elide 是否 包含 -fno      更新时间:2023-10-16

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

在我看来,-fno-elide构造函数是一个优化标志,-O是优化级别。因此,一些-O级别可能包括标志-fno-elide构造函数。我说得对吗?

换句话说,-fno-elide构造函数和-O之间有任何关系吗。。?

换句话说,-fno-elide构造函数之间是否存在关系和-O。。?

是的,存在一种关系,尽管关系很简单:除非您明确禁用gcc,否则它很可能会消除已经处于-O0级别的构造函数。请参阅底部的示例代码以获得证明。

不过这很棘手,编译器可能会做一些非常糟糕的事情,请参阅RVO在失败时强制编译错误。底线是:你总是需要检查生成的程序集,看看引擎盖下到底发生了什么。

请记住(摘自《编程标准工作草案》语言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("%dn", 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禁用了优化,如果出于某种原因需要禁用省略,也必须另外禁用省略。

相关文章: