按值或引用传递std :: string

可能重复:
是传递const std :: string&作为参数的日子吗?

如果支持移动语义,我应该通过值或通过引用传递std::string (未内联函数)? 那么使用小string优化(SSO)的实现呢?

根据你正在做的string有多个答案。

1)使用string作为一个id(将不会被修改)。 通过const引用传递它可能是最好的主意: (std::string const&)

2)修改string,但不希望调用者看到更改。 按值传递是最好的: (std::string)

3)修改string,但希望调用者看到更改。 通过引用传递它是最好的: (std::string &)

4)将string发送到函数中,函数的调用者将永远不会再使用该string。 使用移动语义可能是一个选项(std::string &&)

检查C ++ 11的这个答案 。 基本上,如果你传递一个左值的右值引用

从这篇文章 :

 void f1(String s) { vector<String> v; v.push_back(std::move(s)); } void f2(const String &s) { vector<String> v; v.push_back(s); } 

“对于左值参数,'f1'有一个额外的副本来传递参数,因为它是by-value,而'f2'有一个额外的副本来调用push_back。所以没有区别;对于rvalue参数,编译器必须创build一个临时'String(L“”)“,并将临时传递给'f1'或'f2'。因为'f2'在参数是一个临时值(这是一个右值)时可以利用移动ctor,现在对于'f1'和'f2'这个参数是一样的。“

继续:“这意味着在C ++ 11中,我们可以通过使用传值方法获得更好的性能:

  1. 参数types支持移动语义 – 所有标准库组件都在C ++ 11中完成
  2. 移动构造函数的成本比复制构造函数(时间和堆栈的使用)要便宜得多。
  3. 在函数内部,参数types将被传递给另一个支持复制和移动的函数或操作。
  4. 通过一个临时的参数是很常见的 – 你可以组织你的代码来做更多的事情。

OTOH,对于C ++ 98来说,最好是通过引用传递 – less量数据被复制。 传递常量或非常量取决于您是否需要更改参数。

我相信正常的答案是,如果你需要在你的函数中复制它,它应该被传递的价​​值。 否则通过const引用传递它。

这是一个很好的讨论: http : //cpp-next.com/archive/2009/08/want-speed-pass-by-value/