哪个功能结构更好
Which function structure is better?
看下面的代码:
class MyClass{
public:
MyClass(){}
MyClass(MyClass &&){}
MyClass(const MyClass &){}
};
MyClass f1(){
MyClass &&o=MyClass();
/*...*/
return std::move(o);//or return static_cast<MyClass &&>(o);
}
MyClass f2(){
MyClass o=MyClass();
/*...*/
return o;
}
int main(int, char **){
auto a=f1();
auto b=f2();
}
函数f2
是返回对象的标准形式。可以应用NRVO,并且可以避免额外的复制构造函数调用。f1
是使用右值引用的新形式。对于不支持NRVO但支持右值引用的系统,调用move构造函数而不是copy构造函数,后者在大多数情况下被认为更好。
f1
的问题是:在这种情况下,是否有任何编译器支持NRVO ?这似乎是未来更好的形式。
在这种情况下,有任何编译器支持NRVO吗?
定义"编译器支持"?
f1
所做的是完全破坏编译器优化MyClass
副本的能力。让我们详细看看f1
MyClass &&o=MyClass();
这将创建一个临时的,而不是堆栈变量。然后将该临时对象绑定到一个名为o
的r值引用,该引用将临时对象的生命周期延长到函数结束。
return std::move(o); //or return static_cast<MyClass &&>(o);
这将堆栈绑定的r值引用的r值引用返回到临时对象。因为你返回的是一个值,而不是一个引用,编译器必须从它创建一个临时对象。
将临时文件复制/移动到a
将被忽略。但是您仍然创建了两个临时值(原始值和返回值)。
因此f1
执行以下操作:
create temporary
copy/move from temporary to return value
elide copy/move from return value to `a`.
f2
does:
create stack variable
elide copy/move from stack variable to `b`.
如果NVRO不存在,则有:
create stack variable
copy/move from stack variable to return value
elide copy/move from stack variable to `b`.
因此,f2
在最坏的情况下等于f1
。而且更有可能是更好的。
请不要再试图超越编译器。让复制省略完成它的工作。
这是当前编译器(MSVC10/gcc trunk)的工作方式:
假设MyClass可移动
f1 : move
f2 :
worst case : move
best case : NRVO
假设MyClass不可移动:
f1 : copy
f2 :
worst case : copy
best case : NRVO
所以,即使编译器变得更好,开始为f1这样的函数做NRVO,当f2经典c++ 03函数已经是最佳的时候,为什么要把代码复杂化呢?
相关文章:
- Msgpack能否提供更好的性能和与Python的struct.pack()相同的功能?
- 使用构造函数初始化结构还是在之后设置其值更好?
- 对于这个问题,是否有更好的数据结构和算法选择
- 设计许多单例代码结构的更好方法
- 存储结构的更好方法
- 实现交换/复制功能:有没有更好的方法
- 对于树结构"widget"比"shared_ptr"更好的选择?
- 结构中的矢量是否耗时?使用指针更好吗?
- 在C 中继承类功能:一般问题,以更好地理解,如果有人可以指出我的错误
- 是否有更好的方法(性能提高 /内置功能)获得矩形的旋转角度
- 更多结构/类,以便更好地命名约定
- 选择正确功能的更好方法
- 更好地解释C++指针功能
- 对于复位功能,这是更好的做法
- 在这种情况下更好的是内联功能的宏
- 有没有更好的方法来处理将标识分配给层次结构中的类以供运行时使用
- 有没有更好的方法在没有虚拟功能的情况下切换功能
- 除了 setter 和 getter 之外的任何其他方法,它们将执行相同的功能但更好
- 在高性能计算中更好的做法是:将数据结构传递到一个函数或一组变量中
- 哪个功能结构更好