这个问题是在c++11上下文中提出的。
当从函数返回堆栈上分配的变量时,如果对象定义了移动构造函数,是否优化了副本?
我有这段代码、移动构造函数和我前面描述的函数:
MyBigObject(MyBigObject&& other) {
// code elided
}
MyBigObject createTheObject() {
MyBigObject emptyObj;
// initialize obj with stuff
return emptyOBj;
}
移动构造函数的这一定义是否意味着所有按值返回的值都自动转换为“移动”?或者,拷贝是否会被移动以外的其他机制优化?
如果没有定义移动构造函数,这段代码将如何运行?在这种情况下,会出现完整的副本吗?
发布于 2014-02-23 23:40:23
移动构造函数的这一定义是否意味着所有按值返回的值都自动转换为“移动”?
是。如果您返回一个局部变量,它将被视为一个rvalue,并且如果它有一个move构造函数,则通过移动它来初始化返回值。
或者,拷贝是否会被移动以外的其他机制优化?
移动或复制也可以通过一种称为返回值优化的优化来避免。这在各种情况下都会发生,包括返回一个局部变量。变量直接构造到调用者的堆栈框架中,因此在返回时不需要移动或复制任何内容。
如果没有定义移动构造函数,这段代码将如何运行?在这种情况下,会出现完整的副本吗?
是的,如果没有移动构造函数,那么移动是通过复制完成的。同样,当从函数返回值时,这通常会被省略。
发布于 2014-02-23 23:35:09
移动构造函数的这一定义是否意味着所有按值返回的值都自动转换为“移动”?
不,通常发生的是返回值优化(NRVO),这是复制省略的一种形式,这意味着没有什么可移动的。这既适用于C++03,也适用于C++11。
Iff编译器不能执行复制省略,那么是的,emptyObj
将被移动到调用方的对象中。这只适用于C++11。
请参阅https://stackoverflow.com/questions/12953127/what-are-copy-elision-and-return-value-optimization
https://stackoverflow.com/questions/21976236
复制相似问题