“按值”与“按引用”的C ++速度差异

时间:2012-05-20 17:04:44

标签: c++ performance pass-by-reference pass-by-value

我想测试传递值的速度并在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

这是正确的吗?

“按价值”的速度怎么能超过“按参考”?

2 个答案:

答案 0 :(得分:1)

您的输出的措辞存在一些混淆:您未在代码中的任何位置使用assign1assign2,但您已在输出中提及它们。

无论如何,在看到你真正在做什么之后,我只能说f1通过 value 获取参数,这意味着它调用了复制构造函数,而复制构造函数又复制了成员矢量太大了。这种向量的复制花费了很多时间,当你通过引用获取参数时调用f2时会保存,因此在这种情况下不会复制向量。

答案 1 :(得分:0)

除了已经说过的有关昂贵的复制构造函数的内容之外,我想提一下,你只是在f1f2中丢弃了计算结果。这意味着理论上(假设向量是以可能的方式实现的),编译器可以决定在只读取值时删除整个方法调用,并且很明显删除它们不会导致副作用。这意味着,您最终可能只会测量启动和停止计时器本身所需的时间。

无论如何,除了少数情况外,你应该期望通过引用调用更快,至少如果你传递一个大对象。