首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RVO (返回值优化)适用于所有对象吗?

RVO (返回值优化)适用于所有对象吗?
EN

Stack Overflow用户
提问于 2011-09-29 10:47:24
回答 5查看 13K关注 0票数 54

RVO (http://en.wikipedia.org/wiki/Return_value_optimization)是否保证或适用于C++编译器(特别是GCC)中的所有对象和情况?

如果答案是“否”,那么对类/对象进行这种优化的条件是什么?如何强制或鼓励编译器对特定的返回值执行RVO?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-09-29 11:32:36

返回值优化可以始终应用,不能普遍应用的是,称为返回值优化。基本上,为了进行优化,编译器必须知道要在构造对象的地方返回什么对象。

在RVO (返回一个临时的)的情况下,这个条件是很容易满足的:对象是在return语句中构造的,并且很好,它被返回。

在NRVO的情况下,您必须分析代码,以了解编译器是否能够知道这些信息。如果对函数的分析很简单,编译器很可能会优化它(例如,不包含条件的单个返回语句;同一对象的多个返回语句;编译器知道将返回rr2的多个返回语句,比如rr2.)

请注意,您只能在简单的情况下假设优化,具体来说,wikipedia中的示例实际上可以由足够聪明的编译器进行优化:

代码语言:javascript
复制
std::string f( bool x ) {
   std::string a("a"), b("b");
   if ( x ) return a; 
   else return b;
}

编译器可以将其重写为:

代码语言:javascript
复制
std::string f( bool x ) {
   if ( x ) {
      std::string a("a"), b("b");
      return a;
   } else {
      std::string a("a"), b("b");
      return b;
   }
}

编译器此时可以知道,在第一个分支中,a将被构造来代替返回的对象,而在第二个分支中,这同样适用于b。但我不会指望这个。如果代码很复杂,则假设编译器无法产生优化。

编辑:有一种情况我还没有明确提到,编译器是不允许的(在大多数情况下,即使它被允许,它也不可能这样做)来优化从参数到函数的复制到返回语句:

代码语言:javascript
复制
T f( T value ) { return value; } // Cannot be optimized away --but can be converted into
                                 // a move operation if available.
票数 52
EN

Stack Overflow用户

发布于 2011-09-29 10:57:16

gcc编译器中的所有对象都有RVO (返回值优化)保证吗?

没有任何优化是可以保证的(尽管RVO是相当可靠的,但确实存在有些案子把它扔了)。

如果答案是“否”,那么对类/对象进行这种优化的条件是什么?

一个非常刻意地从您这里抽象出来的实现细节。

请不要知道也不关心这件事。

票数 5
EN

Stack Overflow用户

发布于 2011-12-10 01:16:35

对于Jesper:如果要构建的对象是大的,那么避免复制可能是必要的(或者至少是非常理想的)。

如果发生RVO,则避免复制,您无需再编写任何代码行。

如果没有,您必须手动完成,自己编写额外的脚手架。这可能包括预先指定一个缓冲区,迫使您为这个空对象(可能是无效的,您可以看到它是如何不干净的)编写一个构造函数,以及一个“构造”这个无效对象的方法。

因此,如果有保证,它可以减少我的代码行。不是吗?“并不意味着马苏德是个白痴。然而,对他来说不幸的是,RVO没有得到保证。您必须测试它是否发生,如果没有,编写脚手架并污染您的设计。它不能被放牧。

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

https://stackoverflow.com/questions/7596183

复制
相关文章

相似问题

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