首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >(N)RVO完整示例

(N)RVO完整示例
EN

Stack Overflow用户
提问于 2012-10-20 09:51:44
回答 1查看 439关注 0票数 6

我一直在阅读关于(N)RVO的文章,我想要一个完整的场景描述。我希望这个问题能帮助其他C++ -learners澄清他们的观点。

假设这个场景:

代码语言:javascript
复制
string get_string() {
    string x("racecar");
    //work on x...
    return x;
}

string a( get_string() );
string b = get_string();

请暂时忽略C++11移动语义。

  • 如果不执行(N)RVO,将执行多少个构造函数/赋值/析构函数?(请指出他们指的对象是什么)

  • 如果应用(N)RVO,会发生什么变化?

  • 最后,假设C++11支持移动语义,情况如何变化?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-20 10:14:10

1)在get_string内部,将使用接受const char*的构造函数构造一个字符串对象(x)。

2)当函数返回时,内部构造的字符串将被复制到调用方空间中的临时字符串对象中。

( 3)临时复制到a

4)见1

5)见2

6)见3,但副本将转到b

使用RVO,通过不可见的引用构造函数内部的临时结构可以消除2和5。与进一步的复制省略(而不是RVO),3和6可以消除。这就给我们留下了两个构造,都使用了const char*构造函数。

使用C++11移动语义,如果编译器足够好完成所有的复制省略,则情况根本不会改变。如果复制省略没有完成,那么2、3、5和6仍然存在,而是成为移动而不是副本。但是,与复制省略不同的是,这些操作不是可选的优化。一个符合标准的编译器必须执行它们,假设它还没有执行复制省略。

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

https://stackoverflow.com/questions/12987245

复制
相关文章

相似问题

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