首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >按值返回堆栈中的变量是否优化为移动?

按值返回堆栈中的变量是否优化为移动?
EN

Stack Overflow用户
提问于 2014-02-23 23:33:52
回答 2查看 104关注 0票数 1

这个问题是在c++11上下文中提出的。

当从函数返回堆栈上分配的变量时,如果对象定义了移动构造函数,是否优化了副本?

我有这段代码、移动构造函数和我前面描述的函数:

代码语言:javascript
运行
复制
MyBigObject(MyBigObject&& other) {
  // code elided
}

MyBigObject createTheObject() {
  MyBigObject emptyObj;
  // initialize obj with stuff
  return emptyOBj;
}

移动构造函数的这一定义是否意味着所有按值返回的值都自动转换为“移动”?或者,拷贝是否会被移动以外的其他机制优化?

如果没有定义移动构造函数,这段代码将如何运行?在这种情况下,会出现完整的副本吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-23 23:40:23

移动构造函数的这一定义是否意味着所有按值返回的值都自动转换为“移动”?

是。如果您返回一个局部变量,它将被视为一个rvalue,并且如果它有一个move构造函数,则通过移动它来初始化返回值。

或者,拷贝是否会被移动以外的其他机制优化?

移动或复制也可以通过一种称为返回值优化的优化来避免。这在各种情况下都会发生,包括返回一个局部变量。变量直接构造到调用者的堆栈框架中,因此在返回时不需要移动或复制任何内容。

如果没有定义移动构造函数,这段代码将如何运行?在这种情况下,会出现完整的副本吗?

是的,如果没有移动构造函数,那么移动是通过复制完成的。同样,当从函数返回值时,这通常会被省略。

票数 6
EN

Stack Overflow用户

发布于 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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21976236

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档