90

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

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

4

3 回答 3

161

根据您对字符串的操作,有多个答案。

1)使用字符串作为id(不会被修改)。通过 const 引用传入它可能是这里最好的主意:(std::string const&)

2) 修改字符串但不希望调用者看到该更改。按值传递它是可取的:(std::string)

3) 修改字符串但希望调用者看到该更改。最好通过引用传递它:(std::string &)

4)将字符串发送到函数中,函数的调用者将不再使用该字符串。使用移动语义可能是一种选择(std::string &&)

于 2012-05-28T19:52:36.433 回答
22

检查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' 有一个额外的副本来传递参数,因为它是按值传递的,而 'f2' 有一个额外的副本来调用 push_back。所以没有区别;对于右值参数,编译器必须创建一个临时'String(L“”)' 并将临时值传递给 'f1' 或 'f2'。因为当参数是临时值(即右值)时,'f2' 可以利用移动 ctor,因此传递'f1' 和 'f2' 的参数现在是相同的。”

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

  1. 参数类型支持移动语义 - 所有标准库组件都在 C++11 中执行
  2. 移动构造函数的成本比复制构造函数便宜得多(时间和堆栈使用)。
  3. 在函数内部,参数类型将被传递给另一个同时支持复制和移动的函数或操作。
  4. 通常将临时参数作为参数传递 - 您可以组织代码来执行更多操作。

"

OTOH,对于 C++98,最好通过引用传递 - 更少的数据被复制。传递 const 或 non const 取决于您是否需要更改参数。

于 2012-05-28T20:01:02.303 回答
4

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

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

于 2012-05-28T19:52:39.057 回答