C++17 string_view: 零拷贝字符串视图
请说明C++17 std::string_view的设计原理(非拥有所有权的字符串引用)、相比std::string的优势(避免拷贝、子串操作O(1)),以及使用时需注意的生命周期和数据空终止问题。
回答
我是大山
std::string_view:对字符串序列的非拥有引用(const char* + length),不拷贝、不管理内存。
优势:
- 零拷贝传参:函数参数用string_view替代const string&,避免从char*或子串拷贝string。
- 子串操作O(1):
sv.substr(pos, n)返回新的string_view,无内存分配。 - 标准兼容:支持c_str()返回,兼容const char*和std::string。
典型用法:
void parse(std::string_view sv) { /* 只读操作 */ }
parse("hello"); // 无拷贝
parse(some_string); // 隐式转换
生命周期陷阱:
- string_view不拥有数据,若原字符串析构则sv悬空!
std::string_view get() {
std::string s = "temporary";
return s; // 危险!s析构后sv悬空
}
- 不能保证空终止:
sv.data()不一定以'\0'结尾,传给需C字符串的函数时需用std::string(sv).c_str()。
vs const string&:
- string_view更轻量(指针+长度),但const string&可传临时对象的引用(生命周期延长),string_view则不会延长。