-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
的优化,如果出于某种原因需要禁用省略,您仍然必须另外禁用省略。