为什么标准没有规定RVO和NRVO是强制性的
Why RVO and NRVO are not made obligatory by the standard?
为什么标准没有规定RVO和NRVO优化(如果适用)?例如,当函数生成某个对象并将其作为结果返回时,有一种非常常见的情况。由于RVO/NRVO的原因,复制/移动构造函数通常被省略,但它们仍然需要定义,这有点令人困惑。如果RVO/NRVO在标准中,那么在这种情况下将不再需要复制/移动构造函数。
标准不需要复制省略,因为这需要所有实现在所有情况下都实现它。
只需看看返回值优化与命名的情况-返回值优化。简单地转动这个:
std::string Func()
{
return std::string("foo");
}
进入该功能相同代码:
std::string Func()
{
std::string named("foo");
return named;
}
后者比前者需要更多的编译器。不同的编译器在不同的情况下支持NRVO。当然,在这种琐碎的情况下,他们中的大多数人都支持它,但也有很多不同的情况。在某些情况下,编译器只会说"去死吧",而不会完全进行优化。
您的方式需要以下其中一项:
在所有适用的情况下强制执行副本省略,无论编译器实现有多困难。所以现在每个编译器编写者都必须处理这样的情况:
std::string Func(bool b) { if(b) { std::string named("foo"); return named; } else { std::string named("bar"); return named; } }
在这种情况下,许多编译器不处理NRVO。这是一个简单的情况;它们可能会变得更加复杂。
遍历每个编译器,找到总是使用副本省略的常见情况子集,然后在标准中指定它们作为需求。这太荒唐了;您将基于实现细节进行标准化那从来都不是一件好事。
请注意,在特定情况下,C++17可能会得到拷贝省略的保证。也就是说,每当使用临时对象初始化相同类型的对象时,复制/移动都需要省略。这使得从函数返回不动对象成为可能。
相关文章:
- 变量可能尚未初始化[MIRA 2012规则9.1,强制性]
- MFC 中的窗口消息管理:添加基类调用是否是强制性的?
- 如何避免NRVO的"pessimizing-move"警告?
- alignas() 对 sizeof() 的影响 - 强制性的?
- NRVO 是否也适用于协程?
- RVO/NRVO 不能在 Clang++ 的 C++17 中禁用吗?
- 在存在错误代码的情况下输出参数与 NRVO
- NRVO不应该保证局部命名变量和调用站点变量采用相同的地址吗?
- 功能原型在C++是强制性的吗?
- 在这种情况下,UTF-16 和 UTF-32 的 BOM 是强制性的
- NRVO 是否有效,但异常扔进身体
- NRVO and move
- NRVO for C++ std::string
- C++ABI如何处理RVO和NRVO?
- C NRVO/复制Elision在括号中带有返回语句
- 平台对于 cuDNN 是强制性的吗?
- 如何使用强制性最小元素的Boost Spirit列表操作员
- NRVO-是该程序定义良好的输出
- 是否有像RVO和NRVO这样的语言级别优化
- 为什么标准没有规定RVO和NRVO是强制性的