Do C++程序员通常显式地执行移动,还是仅仅依靠编译器来执行移动
Do C++ coders usually do moves explicitly or do they just rely on the compiler to do it?
我们在一些函数中有这个:
BigClass big;
// prepare big somehow
OtherClass foo(std::move(big), maybe, other, params);
// know that we won't be using "big" after this.
现在大多数C++程序员真的会把移动放在那里以保证移动吗?
在特定的代码中,要么直接移动,要么根本不移动。编译器永远不会移出左值(这不是扩展)。
我会把std::move
放在那里,这样就不会有移动,因为否则就不会有。:)
另一种选择是:
auto MakeBig = [&]()->BigClass {
BigClass big;
//prepare big somehow
return big; // must be a `move`, if not elided!
};
OtherClass foo(MakeBig(), maybe, other, params);
或者,如果你还没有晕倒的话:
OtherClass foo([&]()->BigClass {
BigClass big;
//prepare big somehow
return big; // must be a `move`, if not elided!
}(), maybe, other, params);
在这里,我们将big
的创建封装到lambda中,然后推迟创建。请注意,这并不总是有效的。
这种模式的一个优点是,如果foo
按值获取其第一个参数,则可以取消移动,而按值获取现在是OtherClass
无论如何都要复制的move
类的正确方法。如果它不按值获取第一个参数,则为构造foo
而创建的临时参数仍然可以被忽略,因此只会发生一次移动(在临时参数和foo
之间)。
如果您使用C++11,编译器有时会为您移动(R-Value引用),但如果您想显式移动一个大对象,那么是的,您应该使用显式"移动"它
std::move
更多信息
相关文章:
- 这将执行默认移动操作吗?
- 如果没有带有函数签名的 rvalue 参数,是否会执行 C++ 11 中的移动语义?
- 发送到另一个窗口的鼠标移动消息不执行任何操作
- 当使用三元运算符并删除移动/复制CTOR时,Visual Studio不执行RVO
- 将可执行文件移动到 make 文件中的其他目录后运行可执行文件
- 将执行从一个线程移动到另一个线程,以实现任务并行性并在将来调用
- QProgresDialog:忙碌的等待栏在功能执行时没有移动
- C 可以在程序执行过程中移动内存映射的文件(boost :: intercecess)移动
- 如何执行移动构造函数(C )的呼叫
- Visual Studio 2012 是否正确执行此操作?标准::移动
- VC2013 移动运算符不递归执行移动
- C++11:执行移动操作以更改地址
- ICC 未执行循环不变代码移动
- 如何移动到文件夹并执行Windows命令行调用
- 鼠标移动加速代码执行
- 将对以字符串形式返回文件内容的函数执行移动语义优化或返回值优化,我会从中受益吗
- qt QAbstractItemModel 拖放用于移动项目执行删除/插入
- Do C++程序员通常显式地执行移动,还是仅仅依靠编译器来执行移动
- tellg在文件中执行写入操作后移动
- 当delete my_object;执行?是否所有其他内存都被sizeof(MyClass)向左移动