在 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
很小,但一般来说,通过引用传递大对象是一种很好的做法,以避免不必要的复制。
提示:研究移动语义。
假设有一个名为 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
很小,但一般来说,通过引用传递大对象是一种很好的做法,以避免不必要的复制。
提示:研究移动语义。