当通过常量和不是字符串的最佳选择时,是否有任何情况?
Is there any case when passing by const & is not optimal for strings?
最近我向一个相对较新的用户提到,他应该将字符串参数作为const std::string &
传递,而不是按值传递它们,并收到了一条评论:
引用不一定比传递常量值更好。特别是如果您经常在函数中读取它。
在搜索时,我只找到了建议使用&或const &对于任何类型的X
的经验法则sizeof(X) > sizeof(void *)
。
那么在这种情况下,通过(const(值传递字符串比通过const &
传递它更好(如果有的话(会怎样呢?
当
传递常量时,是否有任何情况,对于字符串不是最佳选择?
在调用方首先没有std::string
对象的情况下,创建一个对象以传递引用是非最佳选择。std::string_view
参数涵盖了这些情况,以及字符串引用是最佳情况的大多数情况。
在这种情况下,通过 (const( 值传递字符串比通过 const &(如果有的话(传递它更好?
您引用的文本描述了这种情况:
。特别是如果您经常在函数中读取它。
解释原因:每个函数调用仅发生一次复制到参数中,而通过引用(或字符串视图(间接地进行函数内的每次访问。鉴于两者都不是免费的,一定有一些间接事件比副本更昂贵。
在您的程序中是否达到该数字是另一回事。该数字在很大程度上受系统功能和输入字符串长度的影响。如果您测量到在目标系统上的程序中按值传递在统计上更快(具有合理的 p 值(,那么这可能是值得的。但这种情况非常罕见,这就是为什么建议使用引用(或字符串视图(的默认选择,除非函数需要副本。
请注意,传递const值通常不是一个好主意,因为它会强制函数在可能移动字符串的情况下再次复制字符串。
相关文章:
- 是否有任何C++功能可以对地图进行排序?
- 在C++行尾写一个分号或多个分号是否会改变任何内容
- C++类型特征,以查看是否可以<uint32_t>对类型"K"的任何变量调用"static_cast(k)"
- 是否有任何建议来统一函数类型限定符并简化可恶的函数类型?
- GoogleMock是否仍然打算与任何测试框架一起使用?
- C++中是否有任何函数等同于python中字典的get函数?
- 用于检查值是否为其任何参数的帮助程序函数
- 在实践中,在运行时为零的乘法中是否有任何"lazy"评估
- MPI:检查是否有任何进程已终止
- 如何检测除整数以外的任何内容是否传递给我的类构造函数?
- C++ 移动语义是否在任何情况下都能节省资源?
- 在调用其析构函数之前,是否有任何实际理由检查某些东西是否可破坏?
- c++ 编译器是否保护常量内存地址免受任何更改?
- 对于堆上的页面对齐内存分配是否有任何优化或不同的 API?
- 使用 std::addressof(std::cout) 而不是 &std::cout 是否有任何风险?
- 是否有任何区域设置会影响宽字符编码?
- 是否有任何模式等效于虚拟模板功能?
- 我的代码中是否有任何类型的错误,因为它没有给出正确的输出
- 使用静态成员函数而不是普通函数是否有任何开销?
- 是否有任何 C 标准函数将值"1"传递给所有 (%s)