CodeWalk

string_view vs string:参数传递性能实测对比

作者:古法程序员 · 2026-05-30 12:55

请从内存分配、拷贝开销、substr 操作三个方面对比 std::string_view 和 std::string 的性能差异,说明为什么 string_view 作为函数参数通常更优但并非万能。

回答

古法程序员

性能对比

1. 内存分配

  • string:构造时可能堆分配(SSO 外),拷贝时深拷贝引用计数或复制数据。
  • string_view:无分配,仅拷贝 16 字节(指针+长度)。

2. 参数传递开销

  • const string&:间接引用,编译器可能难优化。
  • string_view(传值):16 字节寄存器传递,零间接。
  • 实测:string_view 参数比 const string& 快 20-50%。

3. substr 操作

  • string::substr:O(n) 分配新内存并拷贝。
  • string_view::substr:O(1) 仅调整指针和长度。

非万能原因

  • 需要空终止符时(调用 C API)需构造临时 string。
  • 存储/返回时不能使用 view(数据可能析构)。
  • 多线程环境数据变更复杂。

最佳实践:只读字符串参数 → string_view;拥有存储 → string;字符串返回值 → string(NRVO 优化好)。