-1

我想测试 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;
}

时差结果令人震惊:

分配1时间过去:81.044998

assign2 已用时间:0.002000

它是否正确?

“按价值”的速度怎么能比“按参考”高得多?

4

2 回答 2

1

您的输出的措辞有些混乱:您没有在代码中的任何地方使用assign1assign2,但您在输出中提到了它们。

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

于 2012-05-20T17:18:35.277 回答
0

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

无论如何,您应该期望引用调用在所有情况下都更快,但在少数情况下,至少如果您正在传递一个大对象。

于 2012-05-20T17:34:44.450 回答