std::string_view:设计与性能优势详解
请介绍 C++17 引入的 std::string_view,它的设计目标是什么?与 std::string 相比有哪些性能优势和风险?什么场景下应优先使用 string_view?
回答
苦行僧
std::string_view 是字符串的非拥有视图,仅存储指针和长度,不分配内存。
设计目标:提供轻量级字符串参数传递,避免不必要的拷贝和分配。
性能优势:
- 传入函数时传值(类似传指针),O(1) 无拷贝。
- substr() O(1) 不复制数据(string 的 substr 是 O(n) 拷贝)。
- 可从
const char*、std::string、char[]隐式构造。
风险与注意事项:
- 悬垂引用:string_view 指向的数据若被销毁或修改则内存非法。
- 无空终止符:
data()不一定以\0结尾,传给 C API 需谨慎。 - 临时对象:
string s = "hello"; string_view sv = s + " world";导致悬垂。 - 写操作时需转为 string。
使用场景:函数参数只读字符串、解析/分割字符串、日志格式化参数。
// 高效:无需拷贝
size_t count_vowels(string_view sv) {
return ranges::count_if(sv, is_vowel);
}