为什么按值返回的函数比按引用传递的函数慢? < >我理解C++核心准则指定STD::vector应该按值返回(以RVO/NRVO/MODE语义发生),而不是通过引用操作。然而,当我用下面的基准代码测试时,pass_by_引用函数似乎比按值返回的函数快得多。为什么PassByReference乘法函数比RVOMulitply函数快得多

为什么按值返回的函数比按引用传递的函数慢? < >我理解C++核心准则指定STD::vector应该按值返回(以RVO/NRVO/MODE语义发生),而不是通过引用操作。然而,当我用下面的基准代码测试时,pass_by_引用函数似乎比按值返回的函数快得多。为什么PassByReference乘法函数比RVOMulitply函数快得多,c++,optimization,pass-by-reference,benchmarking,rvo,C++,Optimization,Pass By Reference,Benchmarking,Rvo,我正在使用Clang5.0.2 我的编译行是clang++-std=c++17 RVO_PassByReference.cpp-o RVO_PassByReference-O3-march=native #包括 #包括 #包括 #包括 使用名称空间std; 使用名称空间std::chrono; 向量rvommultiply(常数向量&v1,常数向量&v2) { std::向量结果向量; ResultVector.reserve(v1.size()); 对于(size_t i{0};i

我正在使用Clang5.0.2

我的编译行是
clang++-std=c++17 RVO_PassByReference.cpp-o RVO_PassByReference-O3-march=native

#包括
#包括
#包括
#包括
使用名称空间std;
使用名称空间std::chrono;
向量rvommultiply(常数向量&v1,常数向量&v2)
{
std::向量结果向量;
ResultVector.reserve(v1.size());
对于(size_t i{0};i
ResultVector.reserve(v1.size());
中有很多不是由
PassByReferenceMultiply
执行的动态分配。函数完全不同。是的,创建
向量引用向量(10000)
时间之外的测量是不公平的。@TedLyngmo我现在明白了。我已经更改了我的两个函数,它们都必须为向量保留空间。我知道我看到了一个小差异(~240纳秒)在这两个函数之间,正如预期的那样,我的RVO函数比旁路参考函数快。感谢用户4581301和Ted Lyngmo。你不能。这就是为什么人们需要发布这些东西,因为answersI正在使用一个真正的在线基准测试工具来制定答案-但我不习惯,所以花了太长时间。:-@MatthewPittenger您也许可以在未来的基准测试中使用。在
ResultVector.reserve(v1.size());
中有很多动态分配,而不是由
PassByReferenceMultiply
执行。函数完全不同。是的,创建
向量引用向量(10000)
时间之外的测量是不公平的。@TedLyngmo我现在明白了。我已经更改了我的两个函数,它们都必须为向量保留空间。我知道我看到了一个小差异(~240纳秒)在这两个函数之间,正如预期的那样,我的RVO函数比旁路参考函数快。感谢用户4581301和Ted Lyngmo。你不能。这就是为什么人们需要发布这些东西,因为answersI正在使用一个真正的在线基准测试工具来制定答案-但我不习惯,所以花了太长时间。:-@MatthewPitte您也许可以在将来的基准测试中使用。