You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

必须复制输入时,std::string_view与std::string作为函数参数的取舍

两种AddSuffix实现的优劣对比分析

问题背景:我正在研究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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 13:52:40