通过值或引用传递标准::字符串
Passing std::string by Value or Reference
可能的重复项:
传递 const st::string & 作为参数的日子结束了吗?
如果支持移动语义,我应该按值传递std::string
还是按引用传递(到非内联函数)?那么使用小字符串优化 (SSO) 的实现呢?
根据您对字符串执行的操作,有多个答案。
1) 使用字符串作为 id(不会被修改)。通过 const 引用传递它可能是这里最好的主意:(std::string const&)
2) 修改字符串,但不希望调用方看到该更改。 最好按值传入:(std::string)
3) 修改字符串,但希望调用方看到该更改。 最好通过引用传递它:(std::string &)
4)将字符串发送到函数中,函数的调用方将永远不会再使用该字符串。 使用移动语义可能是一种选择(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'有一个额外的副本来传递参数,因为它是按值的,而'f2'有一个额外的副本来调用push_back。所以没有区别;对于 rvalue 参数,编译器必须创建一个临时的"String(L")"并将临时传递给"f1"或"f2"。因为当参数是临时的(这是一个右值)时,'f2'可以利用移动ctor,所以现在'f1'和'f2'传递参数的成本是相同的。
继续:"这意味着在 C++11 中,我们可以在以下情况下使用按值传递方法获得更好的性能:
- 参数类型支持移动语义 - 所有标准库组件在 C++11 中都支持移动语义
- 移动构造函数的成本比复制构造函数便宜得多(时间和堆栈使用情况)。
- 在函数内部,参数类型将被传递给另一个函数或操作它支持复制和移动。
- 传递临时作为参数是很常见的 - 您可以组织代码以执行此操作。
"
OTOH,对于 C++98,最好通过引用传递 - 复制的数据更少。 传递 const 还是 non const 取决于您是否需要更改参数。
正常的答案是,如果您需要在函数中复制它,则应按值传递它。 否则通过常量引用传递它。
这是一个很好的讨论:http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/
- 如何在 C++11 中将标准::字符串转换为标准::u32字符串?
- 如何初始化一个标准::字符串数组?
- 在命名管道中发送标准::字符串流
- 标准::字符串与空字符可能吗?
- 如何从标准::string_view正确创建标准::字符串?
- 从常量字符*、字符*参数到标准::字符串的直接转换接口
- 热将标准::__cxx11::字符串转换为标准::字符串
- 如何将字符*浅复制到标准::字符串?
- 十进制到八进制递归C++.以标准::字符串格式输出
- 如何通过标准字符串打印 ostream 变量的值?
- 如何使用 RPM 从内存中读取标准::字符串
- 我需要初始化标准::字符串吗?
- 标准地图如何知道使用标准字符串的数据作为键
- C++ - 从标准::字符串解析数字
- 如何调整标准::字符串的大小以删除所有空终止符字符?
- URL 编码扩展的 ASCII 标准::字符串在 C++.
- 将字符串::迭代器转换为标准::字符串
- 如何将标准::字符串内容克隆到新的 char[] 数组
- 如何将标准::字符串拆分为标准::string_views的范围 (v3)
- 标准::字符串中的内存泄漏