带有-fno-elide-构造函数的临时对象
Temporary objects with -fno-elide-constructors
我对在clang或gcc中使用-fno-elide-constructors选项并且按值返回对象时c++的正确语义感兴趣。如果我有这个函数,并调用它:
X foo()
{
X x(0);
X y(1);
X z;
if (rand() > 50)
z = x;
else
z = y;
return z;
}
X z = foo();
则可以看到X的复制构造函数只被调用一次。但是,如果我稍微修改一下这个函数,像这样:
X foo()
{
X x(0);
X y(1);
if (rand() > 50)
return x;
else
return y;
}
X z = foo();
则调用复制构造函数两次。从实现的角度来看,我可以看到在后一种情况下这是多么必要,但我发现令人困惑的是,似乎即使我们显式地关闭了复制省略,也会根据函数的实现方式调用不同数量的复制构造函数。
标准中是否有一个部分涵盖了这种行为?
在第一种情况下,您看到返回值优化,这基本上意味着编译器在函数的返回槽中分配z
。这在第二种情况下不起作用,所以你在这里看到了另一个副本。复制省略是不同的:http://en.wikipedia.org/wiki/Copy_elision,并不适用于这里。标准只是说,像这样的东西编译器可以自由地省略不必要的副本,这允许但不需要这两种优化。
相关文章:
- 类中的 Arduino 对象构造函数设置垃圾值
- 编译错误:临时对象构造函数中缺少参数
- 双指针在使用 new 时不调用对象构造函数
- 以支持继承的方式将自身shared_ptr添加到对象构造函数中的向量中
- 在创建对象向量时,不为每个对象唯一调用默认对象构造函数
- GCC __attribute__((constructor)) 在对象构造函数之前调用
- 自定义对象构造函数在循环外部循环
- 从全局对象构造函数停止监视器计时器
- 如何防止使用临时调用构造函数
- Arduino 上的 Sketch 停止在对象构造函数中执行
- C++临时对象成员函数的生存期
- 通过在引用线程对象来传递取消引用的“this”指针来在函数对象构造函数中创建线程是好是坏
- 为什么当对象构造函数投入新表达式时,为什么不调用DealLocation函数
- 临时结构对象构造函数奇数调用
- 未显式引用对象的全局对象构造函数在最终二进制文件 - LD 中被丢弃
- 为什么 Clang++ 不在另一个静态库中运行全局对象构造函数?
- 在未加载上下文的情况下在对象构造函数中使用OpenGL函数
- 为什么我们需要一个用户提供的const对象构造函数
- 对象构造函数的C++数组
- 以临时对象为参数的C++对象构造函数