RVO,移动语义和争取最佳代码
RVO, move semantics and the struggle towards optimal code
如果我理解正确,移动语义允许从临时的、未命名的对象中移动和重用资源。RVO,尽管前面的move语义更进一步,"窃取"了整个对象,以避免额外的构造函数调用和赋值/复制函数。
这对我来说似乎有点违背直觉,如果被调用的构造函数直接使用最终左值目标的地址来直接将数据放置在用户需要的地方,这不是更快、简单、用户显而易见吗?
我的意思是,"在这个位置创建这个对象"似乎比"在某个地方创建这个对象,然后将其复制到正确的位置"更直观。
是的,这"有点违背直觉"。启用复制省略后,构造函数的所有副作用也将被消除。
#include <iostream>
struct X {
X() { std::cout << "Construct" << std::endl; }
X(X&&) { std::cout << "Move" << std::endl; }
~X() { std::cout << "Destruct" << std::endl; };
};
X f() { return X(); }
int main()
{
X x(f());
return 0;
}
复制省略:g++-std=c++11 src test/main.cc
Construct
Destruct
无复制省略:g++-std=c++11-fno省略构造函数src test/main.cc
Construct
Move
Destruct
Move
Destruct
Destruct
编译器知道程序/库是为什么硬件构建的,就能够应用(可选的)拷贝省略。C++语言本身并不知道硬件特定的返回机制。因此,在这种情况下,不可能在某个地址进行构造。
相关文章:
- 在c代码之间共享数据的最佳方式
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么
- 在nodejs中使用本机代码的最佳方法是什么?
- 使用 gtest 框架在单元测试代码中检查目标对象的私有变量的最佳实践是什么?
- 分离类所有权和使用,生成最佳(快速)代码
- C++:销毁此代码的最佳方法是什么?
- 最佳C 11测量嵌入式系统代码执行时间的方法
- 最佳实践:使用随机数生成器的测试代码
- 将使用双向popen()的C++代码移植到POSIX的最佳方式
- iOS和Android之间共享代码的最佳方式
- RVO,移动语义和争取最佳代码
- 将C++代码与Python接口的最佳方式是什么
- 将浮点数组转换为整数的最佳方式.[替换x64的asm代码]
- 分离配置代码和算法代码的最佳做法
- 在同时为 C++03 和 C++14 的代码中进行简单随机洗牌的最佳实践是什么?
- 记录C++代码的最佳位置
- 将帧数转换为时间码的最佳代码/算法
- 与模板配合使用的最佳C++代码覆盖率工具是什么?
- 在VS2008和GCC中编译静态const int=X的最佳代码
- 初始化的最佳代码