通过Value或Reference传递std :: string

时间:2012-05-28 19:45:47

标签: c++ string std move-semantics

  

可能重复:
  Are the days of passing const std::string & as a parameter over?

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

3 个答案:

答案 0 :(得分:120)

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

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

2)修改字符串但不希望调用者看到该更改。最好通过值传递:(std::string)

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

4)将字符串发送到函数中,函数的调用者将永远不会再使用该字符串。使用move semantics可能是一个选项(std::string &&)

答案 1 :(得分:18)

检查this answer for C++11。基本上,如果你传递一个左值的左值参考

来自this article

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。所以没有区别;对于rvalue参数,编译器必须创建一个临时的'String(L“”)并将临时值传递给'f1'或'f2'。因为'f2'可以利用move ctor当参数是临时的(这是一个rvalue)时,成本为'f1'和'f2'传递参数现在是相同的。“

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

  1. 参数类型支持移动语义 - 所有标准库组件都在C ++ 11
  2. 移动构造函数的成本比复制构造函数便宜得多 (时间和堆栈使用情况)。
  3. 在函数内部,参数类型将传递给另一个函数或操作 它支持复制和移动。
  4. 通常将临时文件作为参数传递 - 您可以组织代码来执行此操作。
  5. OTOH,对于C ++ 98,最好通过引用传递 - 减少数据被复制。传递const或非const取决于您是否需要更改参数。

答案 2 :(得分:4)

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

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