我想测试传递值的速度并在C ++中通过引用传递:
class MyAddress{
char *name;
long int number;
char *street;
char *town;
char state[2];
long zip;
std::vector<int> v_int;
public:
MyAddress(int i){
v_int.resize(1000000);
std::fill(v_int.begin(),v_int.end(),i);
}
MyAddress& assign1(MyAddress const& x)
{
MyAddress tmp(x); // copy construction of tmp does the hard work
std::swap(*this, tmp); // trade our resources for tmp's
return *this; // our (old) resources get destroyed with tmp
}
MyAddress& assign2(MyAddress x)//x is a copy of the source
{ //hard work already done
std::swap(*this, x); // trade our resources for x's
return *this; // our (old) resources get destroyed with x
}
void f1(MyAddress v){int i=v.v_int[3];}
void f2(MyAddress const &ref){int i=ref.v_int[3];}
};
MyAddress get_names(MyAddress& ref){return ref;}
主:
int _tmain(int argc, _TCHAR* argv[])
{
float time_elapsed1=0;
float time_elapsed2=0;
for(int i=0;i<100;i++){
{
MyAddress a1(1);
MyAddress a2(2);
MyAddress a3(3);
clock_t tstart=std::clock();
a1.f1(a2);
a1.f1(a3);
clock_t tend=std::clock();
time_elapsed1+=((float)tend-(float)tstart);
}
{
MyAddress a1(1);
MyAddress a2(2);
MyAddress a3(3);
clock_t tstart=std::clock();
a1.f2(a2);
a1.f2(a3);
clock_t tend=std::clock();
time_elapsed2+=((float)tend-(float)tstart);
}
}
std::cout<<std::fixed<<"\nassign1 time elapsed : "
<<time_elapsed1/CLOCKS_PER_SEC;
std::cout<<std::fixed<<"\nassign2 time elapsed : "
<<time_elapsed2/CLOCKS_PER_SEC;
system("pause");
return 0;
}
时差结果令人震惊:
assign1 time逝去时间:81.044998
assign2 timepsed:0.002000
这是正确的吗?
“按价值”的速度怎么能超过“按参考”?
答案 0 :(得分:1)
您的输出的措辞存在一些混淆:您未在代码中的任何位置使用assign1
和assign2
,但您已在输出中提及它们。
无论如何,在看到你真正在做什么之后,我只能说f1
通过 value 获取参数,这意味着它调用了复制构造函数,而复制构造函数又复制了成员矢量太大了。这种向量的复制花费了很多时间,当你通过引用获取参数时调用f2
时会保存,因此在这种情况下不会复制向量。
答案 1 :(得分:0)
除了已经说过的有关昂贵的复制构造函数的内容之外,我想提一下,你只是在f1
和f2
中丢弃了计算结果。这意味着理论上(假设向量是以可能的方式实现的),编译器可以决定在只读取值时删除整个方法调用,并且很明显删除它们不会导致副作用。这意味着,您最终可能只会测量启动和停止计时器本身所需的时间。
无论如何,除了少数情况外,你应该期望通过引用调用更快,至少如果你传递一个大对象。