Do C++程序员通常显式地执行移动,还是仅仅依靠编译器来执行移动

Do C++ coders usually do moves explicitly or do they just rely on the compiler to do it?

本文关键字:执行 移动 C++ 依靠 编译器 常显式 程序员 Do      更新时间:2023-10-16

我们在一些函数中有这个:

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

更多信息