Mic*_*ael 1 c++ rvalue-reference language-lawyer move-semantics c++11
也就是说,当一个人利用C++ 11 typename &&功能(如移动构造函数等)时,通常会在设计良好的C++ 03代码中获得多少性能提升?多长时间值得麻烦,在什么情况下?
编辑:
想象一个替代的宇宙,而不是右值引用C++ 11使用关键字"returns"扩展C++ 03,该关键字标记将由函数返回的局部变量.如果局部变量被标记为"返回",则将其放置在堆栈中通常存在返回值的部分中.想象一下,您可以像这样使用该关键字:
SomeClass foo()
{
returning SomeClass bar; // Created where return value usually resides.
// do something with bar
return bar; // No copy constructor is involved here.
}
Run Code Online (Sandbox Code Playgroud)
我认为这样的机制可以创建make_unique,就像右值引用一样,并且可以减少混淆和潜在的陷阱.三法则仍然是三法则而不是成为五法则; 没有混淆是否&& if rvalue ref或universal ref; 没有必要std :: move等.
我在这里错过了什么?
rvalue引用的值并不主要在于性能.更确切地说,它在于表达力.如果没有右值引用,则无法以有用的方式对类型系统中的所有权进行编码.由于rvalue引用允许的所有权转移,我们现在可以编写完全没有非本地依赖关系的子表达式正确代码.
例如,pre-C++ 11:
int * p = new int[N]; // may be a bug, who knows?
// ... keep paying attention...
delete p; // ah, no bug... or is it?
Run Code Online (Sandbox Code Playgroud)
rvalues:
auto p = std::make_unique<int[]>(N); // fine
Run Code Online (Sandbox Code Playgroud)
请注意,现代示例的单个子表达式本身并不是资源错误的根本原因.相同的方法可以应用于无数的资源/句柄对:内存/指针,文件/句柄,互斥/锁定,任务/继续等.
(如果你认为资源获取和释放是两个相反的极点,那么现代C++应该像磁铁一样编写:两者总是作为一个实体的一部分组合在一起.)
允许类型系统完全保证正确性的位置是语言的显着改进.