-fno elide构造函数是否包含在-O0或任何其他优化级别中
Is -fno-elide-constructors contained in -O0 or any other optimization level?
-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
禁用了优化,如果出于某种原因需要禁用省略,也必须另外禁用省略。
相关文章:
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 为什么 c++ 中的 main() 函数不采用除 int 和 void 之外的任何其他返回类型
- 为什么当我没有变量或其他任何命名的东西时"no match for 'operator==' "错误?
- 如何在不进行任何其他修改的情况下"pretty print" C++的XML字符串?
- 将十六进制字符数组存储在字节数组中,而无需更改为 ASCII 或其他任何东西
- 如何对 int 变量应用验证,使其仅接受整数数据,并且在任何其他数据的情况下不会出错?
- GLSL 计算着色器 使用查找表设置缓冲区会导致不写入任何数据,与其他数据设置相同的缓冲区有效
- 如何计算该程序的复杂性?是否有任何其他复杂性较低的解决方案
- C const在函数声明中以及其他任何地方的anmpersand的右侧
- 如何使用"std::multimap"或任何其他容器对多个值进行排序?
- 如何在任何其他全局变量或静态变量之前创建/构造类实例
- SSO在STD :: String以外的任何其他标准库容器中使用
- 程序在C++ Tutor中执行时有效,但在其他任何地方都不起作用
- 避免重复变量类型:Return type Resolver、C++11 auto、..其他任何东西
- 强制仅在某些代码中使用的特定构造函数,而不是其他任何地方
- 除了在类和程序之前,函数是否需要在其他任何地方声明?
- Ifstream不会读取整数或其他任何东西
- 3摄像机捕获与视频输入或其他任何东西
- 模板中的构造函数不同:一个用于字符串,另一个用于其他任何东西