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

What is the overhead of this operation to modify by reference in 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 很小,但一般来说,通过引用传递大对象是一种很好的做法,以避免不必要的复制。


提示:研究移动语义。