C++ 速度参考值vs(按值)
我有以下问题。我尝试了按值赋值和按引用赋值,如上所述,赋值ba值应该更快,尽管当我尝试我的代码时,它给了我一个相当复杂的结果,因为有时assign1更快,有时assign2更快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
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
对于一般情况,引用赋值几乎总是优于值赋值 原因:
两种配置的性能相同。
通过大量迭代来尝试您的程序,以查看计时的差异。两个赋值函数基本相同。在一种情况下,您自己复制构建临时文件,而在另一种情况下,编译器会自动注入副本
此外,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