将参数传递为 std::string 或 const std::string&?

Pass arguments as std::string or const std::string&?

本文关键字:std string const 参数传递      更新时间:2023-10-16

可能重复:
在C++中,通过值传递还是通过常量引用传递更好?

我在编写文件系统时考虑过这个问题。

vector<string> getFiles(string path);
vector<string> getFiles(const string& path);

哪个更快?哪一个更优雅?

显然,pathgetFiles方法中永远不会改变。

额外奖励:我正在使用C++11。有没有一种移动语义可以加速一切的方法?

黄金法则:

"默认情况下始终通过常量引用。">

这应该是传递函数参数时的默认选择。您根据情况需要选择了其他选项。

  • 对于自定义类,它总是更高效
  • 它对用户来说更直观

在您的情况下,规范的答案是通过const&传递参数,这既是出于性能原因(保证避免复制字符串(,也是因为您记录了intent。只有当您已经分析了代码并确定传递字符串是一个瓶颈时,前者才是重要的——如果不是,那么您主要关注的是"最佳实践",而不是带来巨大的性能差异。

然而,对我来说,如果我看一下你的函数的签名,第二个明确表示"我只会读取你的参数,不会对它做任何事情",而第一个几乎表示你将对参数做一些事情,即使你在处理参数的副本时,你的更改对外界来说是不可见的。

还有一个额外的优点是,通过const引用传递参数可以避免内存分配,如果你在一个没有无限内存(即所有内存(的系统上工作,这很方便。

使用by-value参数可能会更好。看到这篇文章,想要速度?传递值,原因详细。基本上,在如何调用函数方面,您为调用方和/或编译器提供了更大的灵活性。使用const&强制执行了过去的C++98最佳实践,但可以在C++11中反对移动语义。