当通过常量和不是字符串的最佳选择时,是否有任何情况?

Is there any case when passing by const & is not optimal for strings?

本文关键字:是否 任何 情况 最佳选择 常量 字符串      更新时间:2023-10-16

最近我向一个相对较新的用户提到,他应该将字符串参数作为const std::string &传递,而不是按值传递它们,并收到了一条评论:

传递常量

引用不一定比传递常量值更好。特别是如果您经常在函数中读取它。

在搜索时,我只找到了建议使用&或const &对于任何类型的X的经验法则sizeof(X) > sizeof(void *)

那么在这种情况下,通过(const(值传递字符串比通过const &传递它更好(如果有的话(会怎样呢?

传递常量时,是否有任何情况,对于字符串不是最佳选择?

在调用方首先没有std::string对象的情况下,创建一个对象以传递引用是非最佳选择。std::string_view参数涵盖了这些情况,以及字符串引用是最佳情况的大多数情况。

在这种情况下,通过 (const( 值传递字符串比通过 const &(如果有的话(传递它更好?

您引用的文本描述了这种情况:

。特别是如果您经常在函数中读取它。

解释原因:每个函数调用仅发生一次复制到参数中,而通过引用(或字符串视图(间接地进行函数内的每次访问。鉴于两者都不是免费的,一定有一些间接事件比副本更昂贵。

在您的程序中是否达到该数字是另一回事。该数字在很大程度上受系统功能和输入字符串长度的影响。如果您测量到在目标系统上的程序中按值传递在统计上更快(具有合理的 p 值(,那么这可能是值得的。但这种情况非常罕见,这就是为什么建议使用引用(或字符串视图(的默认选择,除非函数需要副本。

请注意,传递const值通常不是一个好主意,因为它会强制函数在可能移动字符串的情况下再次复制字符串。