简洁版本:在许多编程语言中,返回大型对象(例如向量/数组)是很常见的。如果类有移动构造函数,这种风格现在在 C++0x 中是否可以接受,或者 C++ 程序员是否认为它很奇怪/丑陋/令人厌恶?
长版:在 C++0x 中,这仍然被认为是不好的形式吗?
std::vector<std::string> BuildLargeVector();
...
std::vector<std::string> v = BuildLargeVector();
传统版本如下所示:
void BuildLargeVector(std::vector<std::string>& result);
...
std::vector<std::string> v;
BuildLargeVector(v);
在较新的版本中,返回的值是BuildLargeVector
是一个右值,因此 v 将使用以下的移动构造函数来构造std::vector
,假设 (N)RVO 没有发生。
即使在 C++0x 之前,由于 (N)RVO,第一种形式通常也是“高效的”。但是,(N)RVO 由编译器自行决定。现在我们有了右值引用保证不会发生深复制。
Edit:问题确实不是关于优化。所示的两种形式在实际程序中具有几乎相同的性能。然而,在过去,第一种形式的性能可能会差几个数量级。因此,第一种形式长期以来一直是 C++ 编程中的主要代码味道。我希望不再这样了?
戴夫·亚伯拉罕斯(Dave Abrahams)对以下问题进行了相当全面的分析:传递/返回值的速度.
简短的回答,如果您需要返回一个值,那么就返回一个值。不要使用输出引用,因为编译器无论如何都会这样做。当然有一些警告,所以你应该阅读那篇文章。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)