Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将参数作为std::string或const std::string&;传递;?_C++_String_Reference_Arguments_Pass By Reference - Fatal编程技术网

C++ 将参数作为std::string或const std::string&;传递;?

C++ 将参数作为std::string或const std::string&;传递;?,c++,string,reference,arguments,pass-by-reference,C++,String,Reference,Arguments,Pass By Reference,可能重复: 我在编写文件系统时考虑过这一点 vector<string> getFiles(string path); vector<string> getFiles(const string& path); vector getFiles(字符串路径); 矢量获取文件(常量字符串和路径); 哪一个更快?哪一个更优雅 显然,在getFiles方法中,path永远不会更改 奖励:我正在使用C++11。移动语义有什么方法可以加速一切吗?黄金法则: “默认情况下始

可能重复:

我在编写文件系统时考虑过这一点

vector<string> getFiles(string path);
vector<string> getFiles(const string& path);
vector getFiles(字符串路径);
矢量获取文件(常量字符串和路径);
哪一个更快?哪一个更优雅

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


奖励:我正在使用C++11。移动语义有什么方法可以加速一切吗?

黄金法则:

“默认情况下始终按常量引用传递。”

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

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

    • 使用by value参数可能会更好。有关详细原因,请参阅本文。基本上,您可以在调用函数的方式上给调用方和/或编译器更大的灵活性。使用
      const&
      强制执行以前的C++98最佳实践,但在C++11中可能会违反移动语义。

      在您的情况下,标准的答案是通过
      const&
      传递参数,这既是出于性能原因(保证避免复制字符串),也是出于文档意图。只有当您已经分析了代码并确定传递字符串是一个瓶颈时,前者才是重要的——如果不是,那么您主要关注的是“最佳实践”,而不是产生巨大的性能差异

      但是对我来说,如果我看一下你函数的签名,第二个很清楚地说“我只会读取你的参数,不会对它做任何事情”,而第一个很清楚地说你会对参数做一些事情,即使在处理参数副本时,您的更改对外部不可见


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

      在这种情况下,
      t const&
      可能更好。如果只是为了读取字符串,我会同意。如果函数要在内部复制
      常量&
      ,那么在C++11中,按值是最好的选择。不过,您的链接文章介绍了参数的两个非常具体的用法,即传入的参数在函数内部操作,然后返回。就OP的问题而言,很有可能情况并非如此。@TimoGeusch公平。我假设OP提供了一个激发他的问题的例子,但我在寻找一个更普遍的答案。@ybungalobill不一定。我的意思不是从表演的角度,而是从传达信息的角度<当读取函数声明时,code>const&实际上会说“我想看看这个”。如果该函数随后在内部复制,则该声明具有误导性。@Lol4t0:请检查Timo对Bret答案的评论。@Alok与其依赖编译器为您改进代码,不如先编写合理的代码。您的商业编译器可能会执行优化,但您的代码的其他用户呢?你想让你的代码的性能依赖于某个特定的编译器吗?@Lol4t0:Who?不是那篇文章的作者。那篇文章是关于复制省略的,它在这里可能没有任何用处。函数接收到一个R值,在这两种情况下都不会进行复制。或者函数接收到一个L值,在这种情况下,如果它按值获取其参数,则必须复制它,但如果它按引用获取,则不能复制它。复制省略在您需要复制时非常有用,但此处不需要复制。@BenjaminLindley,不清楚是否需要复制,以及明天是否需要复制,何时更改接口会很晚。我的观点是,你不应该调用smth
      黄金规则
      ,让人们不假思索地遵循你的规则。只有当你需要将
      路径
      的值存储到以后的某个地方时,移动语义重载才可能有用。@LightnessRacesInOrbit为什么这个问题会作为~4年前提出的问题的副本关闭?这个问题的答案完全忽略了移动语义和有效C++的引用,这完全指导了C++ 98最佳实践。如果是这样的话,为什么Scott要费心更新这本书及其对C++11的建议?我不确定传递引用会避免内存分配。获取引用参数的明显意图是因为您希望函数在执行时看到对参数的更改。(比如说,一个全局变量通过引用传递给一个也直接访问该全局变量的函数。不管全局变量是好是坏。)知道
      const&
      的真正用途,这是很明显的,但我决不会提倡它的可读性。@Timo只是为了进一步补充,分析可能表明您的应用程序在按值传递字符串方面没有瓶颈,但其他人使用您的代码(或您自己将来的使用)可能会花费比您计划的更多的时间来复制字符串(在OP的示例中,可能是用户使用长路径名重复调用getFiles)-因此,遵循“最佳实践”是一个好主意,即使你认为它现在不会影响你,除非有理由不这样做。