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

时间:2017-06-21 20:52:33

标签: c++ vector reference containers overhead

假设有一个名为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,还是只是通过引用传递而且开销可以忽略不计?

1 个答案:

答案 0 :(得分:3)

是的,这将复制 整个向量,复杂度与second的大小呈线性关系,如ref中所述。

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

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

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

提示:研究移动语义。