此操作在C++中通过引用进行修改的开销是多少



假设有一个名为 second 的大向量,现在我希望我自己的向量first指向大向量。我写了这段代码:

#include <iostream>
#include <vector>
std::vector<int> second (100000,100);
void modify(std::vector<int>& i) {
  i = second;
}
int main ()
{
  std::vector<int> first(1, 1); 
  modify(first);    
  return 0;
}

modify功能确实存在开销吗?second的内容是要克隆到一个新的数组中,然后传递到first,还是只是通过引用传递,开销可以忽略不计?

是的,这将复制整个向量,并且复杂性在 second 的大小上是线性的,如 ref 中所述。

通过将引用作为函数参数传递来避免的是将first复制到参数i中。换句话说,如果你的函数是这样的(按值传递向量 - 这将改变函数的语义(:

// more expensive!
void modify(std::vector<int> i) {
  i = second;
}

然后,您将支付将first复制到i的费用,加上将second复制到i的费用。当然,在您的代码中,这不会有什么区别,因为i很小,但一般来说,通过引用传递大型对象是一种很好的做法,以避免不必要的副本。


提示:研究移动语义。

最新更新