




std::string_view 是 C++17 引入的零拷贝只读字符串视图,不拥有数据、仅持指针和长度;适用场景为仅需读取且源生命周期覆盖其使用期,须严防悬垂指针。
std::string_view 是 C++17 引入的轻量级只读字符串引用,它不拥有字符串数据,只持有指向已有字符序列的指针和长度 —— 所以零拷贝、无内存分配、构造开销极小。
std::string_view 替代 const std::string&
核心判断标准:你只需要「读」字符串内容,且传入的源生命周期能覆盖 string_view 的整个使用期。
std::string 或字面量创建新对象std::vector<:string_view> 存储大量日志行或配置键名,避免重复存储相同字符串副本"hello" 可隐式转为 string_view,但注意其底层是静态存储,生命周期永久;而 std::string{"hello"}.c_str() 转成的 string_view 就是悬垂指针string_view 的生命周期陷阱怎么避最大风险不是性能,而是野指针 —— string_view 本身不管理内存,一旦它指向的原始数据被销毁,访问即未定义行为。
std::string 返回 string_view:auto bad() { std::string s = "hi"; return std::string_view{s}; } → s 析构后视图失效.c_str() 构造长期存活的 string_view,除非确认原 string 生命周期更长std::string)assert(!sv.empty() &
& sv.data() != nullptr);,但不能替代生命周期分析string_view 和 std::string 混用要注意什么它们能互相转换,但方向不同,语义差异明显:
std::string_view → std::string:显式构造或赋值会触发拷贝,比如 std::string{sv} —— 这是你主动选择“付出拷贝代价换所有权”std::string → std::string_view:隐式转换允许,但仅当 string 对象在视图使用期间持续有效sv == "abc"、sv == std::string{"abc"} 都合法,内部按字符逐个比,不依赖空终止printf 等 C 函数:没有 c_str() 成员,需先转 std::string 或用 sv.data() + sv.size() 手动传参(注意非 null-terminated)真正难的不是怎么写 string_view,而是准确判断“这段字符串的源头在哪、谁负责释放、它能活多久”。很多性能收益,一不小心就变成崩溃或静默错误。