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

时间:2013-01-12 17:42:51

标签: c++ string reference arguments pass-by-reference

  

可能重复:
  Is it better in C++ to pass by value or pass by constant reference?

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

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

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

显然,path方法永远不会更改getFiles

奖励:我使用的是C ++ 11。有没有办法移动语义会加速一切?

3 个答案:

答案 0 :(得分:5)

黄金法则

“默认情况下始终通过const引用。”

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

  • 自定义类的效率始终更高。
  • 对用户来说更直观。

答案 1 :(得分:4)

在你的情况下,规范的答案是通过const&传递参数,这既是出于性能的原因(保证避免复制字符串),也是因为你记录 intent 。前者只有在您对代码进行分析并确定传递字符串是一个瓶颈时才是重要的 - 如果不是,那么您通常会查看“最佳实践”而不是产生巨大的性能差异。

然而对我来说,如果我看一下你的功能的签名,第二个清楚地说明“我只会阅读你的参数而不对它做任何事情”,而第一个很明确表示你会做某事参数,即使您在处理参数副本时外部也看不到您的更改。

还有一个额外的好处,即通过const引用传递参数可以避免内存分配,如果您正在处理一个没有无限内存的系统(即所有内存),这很方便。

答案 2 :(得分:1)

使用by-value参数可能会更好。有关详细原因,请参阅此帖子Want Speed? Pass by Value。基本上,您可以让调用者和/或编译器更灵活地调用函数。使用const&强制执行以前的C ++ 98最佳实践,但可以在C ++ 11中使用移动语义。