最佳答案
在许多编程语言中,返回大型对象(例如向量/数组)是很常见的。如果类有一个 move 构造函数,这种风格现在在 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
返回的值是一个 rvalue,因此假设(N) RVO 不发生,v 将使用 std::vector
的 move 构造函数构造。
甚至在 C + + 0x 之前,第一种形式通常是“有效的”,因为(N) RVO。然而,(N) RVO 是由编译器决定的。既然我们有了右值引用,那么就不会发生深度复制了。
编辑 : 问题真的与优化无关。所显示的两种形式在现实世界的程序中具有几乎相同的性能。然而,在过去,第一种形式的表现可能会差一个数量级。因此,第一种形式在很长一段时间里都是 C + + 编程中的主要代码味道。希望不再是了?