为什么按值传递string_view比 const 引用更快

why passing string_view by value is faster than const reference

提问人:0xDEADC0DE 提问时间:10/6/2020 更新时间:10/6/2020 访问量:191

问:

我检查了这个问题,大多数答案都说我应该按值传递它,尽管它显然传递了更多的数据(因为通过值你传递了 8 个字节,而通过引用只传递了 4 个字节,在 32 位系统中 sizeof(string_view) > sizeof(string_view*)) 这在 C++20/17 中仍然相关吗?有人可以解释为什么吗?

C++ 参数传递 引用

评论

0赞 PaulMcKenzie 10/6/2020
而只有 4 个字节 -- 你从哪里得到这些信息?
1赞 User12547645 10/6/2020
我认为 refrence 一般是有开销的。这就是为什么你不通过 ref 传递 ints,对吧?
0赞 Vlad from Moscow 10/6/2020
@0xDEADC0DE 在内部按引用传递实现为通过指针传递。因此,在函数中,您需要始终取消引用指针。
2赞 Eljay 10/6/2020
引用可能会产生额外的开销,并且通常(但不一定!)作为逐指传递实现。在一个性能实验中,引用使我们的性能降低了一个数量级,但这对引用来说是病态的。我们的参数截止值为 256 字节或更少,参数的性能效率更高,512 字节或更大作为参考更好。256-512有点灰色地带。这是针对特定平台的,其他平台肯定会有不同的行为特征。(和配置文件,配置文件,配置文件。-O3
1赞 Eljay 10/6/2020
对于我们的应用程序,它位于两个不同但非常相似的 64 位平台上。我们正在将我们的应用程序移植到另外两个不同架构的 64 位平台上,这将使我们之前的测试无效,我们将不得不重新做一遍。变化是唯一不变的。软件工程永远不必说你已经完成了

答:

4赞 eerorika 10/6/2020 #1

通过引用(以及指针)进行间接操作是有代价的。该成本可能超过复制几个字节的成本。与大多数情况一样,您需要通过测量来验证这是否适用于您的用例/目标系统。请注意,如果函数是内联扩展的,则不太可能有任何差异,因为无论哪种情况,您最终都可能得到相同的程序集。即使没有,差异也可能非常小且难以衡量。