string_view vs string:参数传递性能实测对比
请从内存分配、拷贝开销、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 优化好)。