深度剖析 C++ 之 string(下)
string 的内存管理与优化
C++ 的 std::string 类通过动态内存分配管理字符串数据,但具体实现可能因编译器而异。现代实现通常采用短字符串优化(SSO),即短字符串直接存储在对象内部,避免堆分配。长字符串则通过堆内存管理。
- SSO 的典型阈值是 15 或 22 字节(取决于实现),可通过
capacity()和size()比较验证。 - 频繁的字符串操作可能导致多次内存分配,使用
reserve()预分配内存提升性能。
示例代码:
std::string s;
s.reserve(100); // 预分配 100 字节
for (int i = 0; i < 100; ++i) s += 'x'; // 避免多次分配
string 的迭代器与算法
std::string 提供随机访问迭代器,支持标准库算法:
std::string s = "hello";
std::transform(s.begin(), s.end(), s.begin(), ::toupper); // 转大写
cbegin()/cend()返回常量迭代器,避免修改。- 反向迭代器
rbegin()/rend()支持逆向遍历。
string 与编码处理
std::string 本质是字节序列,不直接处理编码。多字节字符(如 UTF-8)需谨慎操作:
std::string utf8 = "你好";
std::cout << utf8.size(); // 输出 6(非字符数)
- 推荐使用
std::wstring(宽字符)或第三方库(如 ICU)处理复杂编码。 - C++20 引入
std::u8string(UTF-8 专用),但支持有限。
string 的性能陷阱
- 避免
operator+拼接长字符串,改用+=或append()。 std::string_view(C++17)可替代只读场景,减少拷贝开销。- 移动语义(C++11)可优化临时字符串传递:
std::string createString() { return "temp"; }
std::string s = createString(); // 触发移动构造
string 的线程安全性
- 不同线程同时修改同一
std::string对象需外部同步(如互斥锁)。 - 只读操作(如
c_str())在无并发修改时是线程安全的。
扩展应用:正则表达式
<regex> 库支持字符串模式匹配:
std::regex pattern(R"(\d+)"); // 匹配数字
std::string text = "a1b23";
bool match = std::regex_search(text, pattern);
注:实际实现细节可能因编译器(如 GCC、MSVC)而异,建议参考对应文档或源码。

被折叠的 条评论
为什么被折叠?



