C++ 在C+;中通过引用修改此操作的开销是多少+;?
假设有一个大向量叫做C++ 在C+;中通过引用修改此操作的开销是多少+;?,c++,vector,reference,containers,overhead,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
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;
}
#包括
#包括
标准:向量秒(10000100);
无效修改(标准::向量&i){
i=秒;
}
int main()
{
std::向量优先(1,1);
修改(第一);
返回0;
}
modify
函数确实存在开销吗?是将第二个的内容克隆到一个新数组中,然后传递到第一个中,还是只通过引用传递,开销可以忽略不计?是的,这将复制整个向量,复杂性在第二个的大小上是线性的,如中所述
通过将引用作为函数参数传递所避免的是将首先
复制到参数i
中。换句话说,如果您的函数是这样的(通过值传递向量,这将改变函数的语义):
//更贵!
无效修改(标准::向量i){
i=秒;
}
然后您将支付将第一次
复制到i
的费用,再加上将第二次
复制到i
的费用。当然,在您的代码中,这并没有什么区别,因为i
很小,但一般来说,通过引用传递大型对象是一种很好的做法,以避免不必要的副本
学习移动语义。这里没有参考,只有指针。但更重要的是,您的
modify
函数实际上并没有做任何有用的事情。@OliverCharlesworth抱歉,我刚刚更正了我的代码片段now@FrançoisAndrieux抱歉,我刚刚更正了我的代码片段。您可能需要对移动语义的概念进行一些研究。它允许您将一个对象的值传输到另一个具有低常量复杂性的兼容对象(通常是相同类型的对象)。通过引用这样做可能没有“开销”,至少在您展示的代码中没有。这样做实际上可能会便宜得多。由于没有发生任何有用的事情,编译器可能能够优化调用。是的,如果启用了优化标志!通过值接受向量将改变函数的语义。的确@SergeyA,更新了,谢谢!然而,我认为OP很困惑,并试图澄清这一点。
// more expensive!
void modify(std::vector<int> i) {
i = second;
}