推荐在什么场景下使用std::move
?
std::vector<int> func()
{
std::vector<int> toReturn(1000000,5);
return std::move(toReturn); // 1
}
int main()
{
std::vector<int> datos = std::move(func()); // 2
// operaciones varias
}
在上面的例子中,是std::move
? 为什么?滥用 std::move 会产生什么影响?
它有什么作用
std::move
?std::move
将 a 转换Lvalue
为 aRvalue
。它有什么用
std::move
?C++11 向目录添加了一个新的构造函数。你的签名是
POO(POO&&)
. 如果已定义此构造函数,则在接收到 a 时会自动调用Rvalue
它,其功能是将一个对象的状态转移到另一个对象,避免对其进行复制。C++11 还允许您使用新的赋值运算符,其签名为
POO& operator=(POO&&)
.这两个新特性可以共存,没有复制构造函数和所有生命的赋值问题。请记住,实现复制构造函数会禁用默认构造函数实现
move
,反之亦然。以上也适用于赋值运算符。对于重物来说,这可能是一个显着的性能改进。一个例子:
尽管将指针从一个地方复制到另一个地方似乎比复制所有涉及的内存要轻得多,但如果您运行该示例,它会变得更清楚。在发行版中运行此代码,在我的机器上它给出以下时间:
同样清楚的是,只有当对象(直接或间接)使用动态内存时,移动语法才有意义,因为这种改进仅适用于指针。
使用的缺点
std::move
是原始对象失去了它的状态。通常这不应该是一个问题,因为这些语义的调用不是随机的。什么时候应该使用 std::move?
move
正如@Angel-Angel 所指出的,语法可以通过调用自动执行return
。这应该是当前编译器优化目录的一部分。在这种情况下,以下两个函数是等效的。但是,如果
std::move
它通常是隐式调用的,你应该什么时候使用它呢?大多数情况下,这个函数主要用于构造函数和赋值实现
move
,因为我们确保嵌套对象从这种优化中受益:在使用
std::unique_ptr
. 特别是当它们在容器中时。如果我们想在std::unique_ptr
向量中狂提取或插入a,程序将无法直接编译:如果将语法应用于
move
没有实现构造函数的对象会发生什么move
?发生的情况是,如果未找到构造函数
move
,编译器将尝试调用构造函数副本。如果这也没有找到,则会发生编译时错误。换句话说,将语法
move
应用于未准备好的对象不应在功能和性能方面产生负面影响。解释完所有这些并返回到最初问题的代码:
很明显,在这两种情况下,语法的附加值都是 null,尽管
1
在编译器未在返回值中应用优化的极少数情况下,使用可能是必要的。Eferion 的解释非常好,我想评论他的解释但我还是不能;但是,我想在您的解释中添加一些内容。
从 C++11 开始,当编译器遇到 a 时
return
,它会将返回对象转换为 a,Rvalue;
因此根据情况调用移动构造函数或赋值运算符。所以你不需要做
来源:http ://cppactual.blogspot.com/2016/04/understanding-la-sintaxis-move.html