c++ 中 rng 的实际成本与 ref 的比较

Real cost of rng in c++ compare with ref

本文关键字:ref 比较 rng c++      更新时间:2023-10-16

在这个例子中:

#include <iostream>
#include <vector>
#include <string>
typedef std::vector<std::string> vs;
vs test1()
{
  vs strings;
  strings.push_back("a");
  strings.push_back("b");
  strings.push_back("c");
  return strings;
}
void test2(vs& strings)
{
  strings.push_back("a");
  strings.push_back("b");
  strings.push_back("c");
}
int main()
{
  vs data = test1();
  test2(data);
  return 0;
}

我测试了两种填充字符串向量的方法。我认为在第一种情况下我们复制向量,在第二种情况下,它可能更好,因为我们只是给出向量的引用。那么有什么好方法,复制对计算机来说是一个非常大的成本吗?

谢谢你的回答!

为了清楚起见,我建议使用第一个。NRVO 应该不会对性能产生影响。

如果目的是创建一个新对象并返回它,则第一个。如果要修改现有方法,请使用第二个。

它们并不完全做同样的事情:

int main()
{
  vs data{"test"};
  data = test1();
  //data is {a, b, c}
  vs data2{"test"};
  test2(data2);
  //data is {test, a, b, c}
  return 0;
}

第一个创建一个新向量,只有这三个字符串。第二个,在现有向量的末尾添加这三个字符串。因此,功能略有不同

在性能方面,由于有(N)RVO和移动语义,您可以使用第一个更清晰的语义。