首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RVO与std::unique_ptr<>清理

RVO与std::unique_ptr<>清理
EN

Stack Overflow用户
提问于 2012-12-08 14:58:37
回答 2查看 674关注 0票数 1

这是一个关于对象销毁与返回值优化的C++规范的问题。

std::unique_ptr<>清理之前,我能期望RVO返回正确的值吗?

代码语言:javascript
复制
Foo
Bar()
{
  std::unique_ptr<Foo> ptr = new Foo;
  return *ptr;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-08 15:05:28

无论是否使用RVO,它都将返回正确的值(本例中没有RVO )。该函数返回一个具体的Foo,因此在销毁指针之前,*ptr将被复制到返回值中。

也就是说,

代码语言:javascript
复制
Foo foo;
foo = Bar();

类似于(更明确地解开unique_ptr )

代码语言:javascript
复制
  Foo foo;
  Foo* ptr = new Foo;
  foo = *ptr;
finally:
  delete ptr;
票数 5
EN

Stack Overflow用户

发布于 2012-12-08 15:21:32

当函数返回类类型对象时,仅在两种情况下允许RVO:

  • 返回的表达式是非易失性自动对象的名称,或
  • 返回的表达式引用的是尚未绑定到引用的临时对象。

这样你的代码就不会触发RVO。

如果使用自动存储来声明Foo对象,则允许编译器执行RVO:

代码语言:javascript
复制
Foo bar()
{
    Foo foo;
    return foo;    // foo can be constructed directly as the returned object
}

如果出于某种原因,您必须使用new创建对象,并且希望消除复制操作,则可以使用std::move,它会将表达式更改为右值:

代码语言:javascript
复制
Foo bar()
{
    std::unique_ptr<Foo> ptr(new Foo);
    return std::move(*ptr);    // No deep copy if Foo implements
                               // its own move constructor
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13775315

复制
相关文章

相似问题

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