将参数传递为 std::string 或 const std::string&?
Pass arguments as std::string or const std::string&?
可能重复:
在C++中,通过值传递还是通过常量引用传递更好?
我在编写文件系统时考虑过这个问题。
vector<string> getFiles(string path);
vector<string> getFiles(const string& path);
哪个更快?哪一个更优雅?
显然,path
在getFiles
方法中永远不会改变。
额外奖励:我正在使用C++11。有没有一种移动语义可以加速一切的方法?
黄金法则:
"默认情况下始终通过常量引用。">
这应该是传递函数参数时的默认选择。您根据情况需要选择了其他选项。
- 对于自定义类,它总是更高效
- 它对用户来说更直观
在您的情况下,规范的答案是通过const&
传递参数,这既是出于性能原因(保证避免复制字符串(,也是因为您记录了intent。只有当您已经分析了代码并确定传递字符串是一个瓶颈时,前者才是重要的——如果不是,那么您主要关注的是"最佳实践",而不是带来巨大的性能差异。
然而,对我来说,如果我看一下你的函数的签名,第二个明确表示"我只会读取你的参数,不会对它做任何事情",而第一个几乎表示你将对参数做一些事情,即使你在处理参数的副本时,你的更改对外界来说是不可见的。
还有一个额外的优点是,通过const引用传递参数可以避免内存分配,如果你在一个没有无限内存(即所有内存(的系统上工作,这很方便。
使用by-value参数可能会更好。看到这篇文章,想要速度?传递值,原因详细。基本上,在如何调用函数方面,您为调用方和/或编译器提供了更大的灵活性。使用const&
强制执行了过去的C++98最佳实践,但可以在C++11中反对移动语义。
相关文章:
- cppcheck在const std::string[]上引发警告
- 将std::string传递给WriteConsole API
- 为std::string的某个索引赋值
- 使用 std::string () const 函数启动线程或未来
- 当我们进行一些操作时,应该使用什么'std::string'或'std::stringstream'?
- 如何更改大小(std::string)
- std::string 的对象真的可以移动吗?
- SegFault 同时使用 std::string::operator+= 和函数作为参数
- 无法从 std::string 中提取C++ Unicode 符号
- std::string 构造函数如何处理固定大小的 char[]?
- 真的没有来自 std::string_view 的 std::string 的显式构造函数吗?
- 将C++ std::string 转换为 UTF-16-LE 编码的字符串
- 重载 + 自己的类和 std::string 的运算符
- 如何使用 std::string 作为 QHash 的键?
- 将日语 wstring 转换为 std::string
- 可以从std::string继承以提供类型一致性吗
- 构造函数采用std::string_view与std::string并移动
- 在共享缓冲区内存中创建 ::std::string 对象
- std::string.size() 未知行为
- Valgrind 在 std::string::swap 中报告 SIGILL