C++ 速度参考值vs(按值)

C++ 速度参考值vs(按值),c++,reference,pass-by-reference,C++,Reference,Pass By Reference,我有以下问题。我尝试了按值赋值和按引用赋值,如上所述,赋值ba值应该更快,尽管当我尝试我的代码时,它给了我一个相当复杂的结果,因为有时assign1更快,有时assign2更快 class MyAddress{ char *name; long int number; char *street; char *town; char state[2]; long zip; std::vector<int> v_int; pu

我有以下问题。我尝试了按值赋值和按引用赋值,如上所述,赋值ba值应该更快,尽管当我尝试我的代码时,它给了我一个相当复杂的结果,因为有时assign1更快,有时assign2更快

    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 
    }
};
你怎么解释?对我来说,在这种情况下,结果似乎与值或引用方法无关


最后,我使用了类似的方法,因为如果我理解正确,我认为这是建议的方法

MyAddress get_names(MyAddress& ref){return ref;}
现在在assign2中是这样做的:

a1.assign2(get_names(a2));
a1.assign2(get_names(a3));
事实上,assign2的性能稍好一些,至少每次都是这样,不像以前那样可以互换。但这就是我应该看到的区别吗

assign1 time elapsed : 127.087997
assign2 time elapsed : 126.691002

assign1 time elapsed : 137.634995
assign2 time elapsed : 136.054993
最后:

assign1 time elapsed : 1404.224976
assign2 time elapsed : 1395.886963
对于一般情况,
引用赋值几乎总是优于值赋值

原因:

  • 引用赋值不会在堆栈上创建新空间
  • 它不必将值从旧变量复制到新变量
  • 对于大多数程序来说,上述开销可能微不足道。然而,const和reference是一种通用的编程实践

    在当前程序中,
    两种配置的性能相同。
    通过大量迭代来尝试您的程序,以查看计时的差异。

    两个赋值函数基本相同。在一种情况下,您自己复制构建临时文件,而在另一种情况下,编译器会自动注入副本


    此外,10对于您的测试来说还不够大。

    无关紧要。这两个函数都可以进行复制。通过引用进行分配可能会更快,但在创建新副本并通过
    swap
    进行分配时则不然,因为这是获得强异常安全性的最简单习惯用法。如果需要副本,请始终使用
    assign2
    版本。有时候,它更乐观。另外,你是否在做那个启用优化的愚蠢基准测试?@cf16,你真的应该阅读上面的链接,它解释了何时何地可能更快。您可能还想寻找另一种方法来描述可能发生的优化。最后,在C++11中,您可能希望提供移动操作(构造函数/赋值),以避免依赖编译器优化
    a1.assign2(some_function())
    可以避免不必要地复制参数(返回值优化、复制省略或任何您喜欢的调用)。
    assign1 time elapsed : 127.087997
    assign2 time elapsed : 126.691002
    
    assign1 time elapsed : 137.634995
    assign2 time elapsed : 136.054993
    
    assign1 time elapsed : 1404.224976
    assign2 time elapsed : 1395.886963