首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么RVO和NRVO不是强制性的标准?

为什么RVO和NRVO不是强制性的标准?
EN

Stack Overflow用户
提问于 2013-08-30 22:37:36
回答 1查看 1K关注 0票数 7

为什么RVO和NRVO优化不是强制性的(当它们是适用的)按照标准?例如,当一个函数生成某个对象并作为结果返回它时,有一种非常常见的情况。复制/移动构造函数通常因为RVO/NRVO而被省略,但它们仍然需要定义,这有点让人困惑。如果RVO/NRVO在标准中,则在这种情况下不再需要复制/移动构造函数。

EN

回答 1

Stack Overflow用户

发布于 2013-08-31 00:53:29

标准不需要复制省略,因为这将要求所有实现在所有情况下都实现它。

只需看看返回值优化与命名返回值优化的情况。只需转一转:

代码语言:javascript
复制
std::string Func()
{
  return std::string("foo");
}

在这个功能相同的代码中:

代码语言:javascript
复制
std::string Func()
{
  std::string named("foo");
  return named;
}

后者对编译器的要求比前者高得多。不同的编译器在不同的情况下支持NRVO。当然,在这种琐碎的情况下,大多数人都支持它,但是有很多不同的情况。在某些情况下,编译器只会说“去他的”,而不会完全进行优化。

您的方式需要下列之一:

  1. 在所有适用的情况下,无论编译器实现多么困难,都要强制执行复制省略。因此,现在每个编译器编写人员都必须处理这样的情况: std::string Func(bool b) { if(b) { std::string named("foo");返回命名;}{ std::string named("bar");返回命名;} 在这种情况下,许多编译器不处理NRVO。这是一个简单的例子,他们可以变得比这复杂得多。
  2. 遍历每个编译器,找出总是使用复制省略的一个公共子集,然后在标准中将它们指定为需求。这是完全可笑的;您将基于实现细节进行标准化。这可不是件好事。

请注意,在特定情况下,C++17可能会得到一个复制的保证。也就是说,当临时对象被用于初始化同一类型的对象时,复制/移动都需要省略。这使得从函数返回不动对象成为可能。

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

https://stackoverflow.com/questions/18542441

复制
相关文章

相似问题

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