必须复制输入时,std::string_view与std::string作为函数参数的取舍
问题背景:我正在研究
std::string_view的使用优势及参数列表中的应用场景,也清楚通常不建议返回std::string_view。现需实现一个为输入字符串添加后缀的简单函数,有两种实现方式:
方式一代码:
std::string AddSuffix(std::string_view inputString) { return std::string(inputString) + "!"; }
方式二代码:
std::string AddSuffix(std::string inputString) { return inputString + "!"; }
虽然两种实现最终都需要复制输入字符串,但在不同调用场景下存在明显差异:
传入
std::string类型参数时:
方式二的参数是值传递,会在参数接收阶段触发一次std::string的拷贝构造;方式一接收std::string_view时仅创建一个轻量视图,不拷贝原字符串,直到构造返回的新std::string时才完成拷贝。两者总拷贝次数一致,性能差异可忽略,但方式一的参数传递成本更低(std::string_view是小对象,拷贝成本远低于std::string)。传入C风格字符串(
const char*)或其他可转换为std::string_view的类型时:
方式二会先把const char*隐式构造为std::string(一次拷贝),后续拼接后缀时再生成新字符串;方式一则直接用std::string_view指向原C字符串,仅在构造返回值时做一次拷贝。这种场景下方式一比方式二少一次不必要的中间拷贝,效率更高。参数兼容性层面:
方式一支持所有能隐式转换为std::string_view的字符串类或字符序列,包括std::string、const char*、std::string的子串视图等;方式二仅支持std::string或能隐式转为std::string的类型,灵活性远不如方式一。
总结:如果函数需要处理多种字符串输入类型,方式一明显更优;即便确定只接收std::string参数,方式一的参数传递成本更低、兼容性更好,依然是更推荐的选择。
内容的提问来源于stack exchange,提问作者dpardo

