-fno-elide-constructors是否包含在-O0或任何其他-O [其他级别]中?
在我看来,-fno-elide-constructors是一个优化标志,-O是优化级别。因此,某些-O级别可能包括标志-fno-elide-constructors。 我是对的吗?
换句话说,-fno-elide-constructors和-O ..之间是否有任何关系?
答案 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。