C++ 字符序列详解
一、字符串本质论:从内存布局说起
所有 C++ 字符串的本质都是 const char* 的变形,但标准库的封装让这个基础类型焕发出惊人能量。通过内存地址解析,我们得以窥见字符串的真实面貌:
void reveal_string_essence(const std::string& s) {
const char* p = s.c_str();
std::cout << "内存地址:" << (void*)p << "\n物理长度:" << s.capacity() << "\n逻辑长度:" << s.size() << "\n终止符位置:" << (void*)(p + s.size());
}
现代 string 实现采用短字符串优化(SSO)技术,当字符串长度小于 16 字节时(取决于实现),直接存储在栈空间避免堆分配。通过以下实验可验证:
void sso_detector() {
std::string short_str = "SSO Magic"; // 9 字符
std::string long_str(32, 'x');
auto print = [](const std::string& s) {
std::cout << "地址差:" << (void*)&s << " vs " << (void*)s.c_str() << '\n';
};
print(short_str); // 地址相同(栈存储)
print(long_str); // 地址不同(堆存储)
}
二、字符串手术:现代分割技法
传统字符串分割常导致多次内存分配,现代 C++ 可通过视图切割实现零拷贝解析:
std::vector<std::string_view> {
std::vector<std::string_view> tokens;
pos = ;
((pos = sv.(delim)) != sv.npos) {
tokens.(sv.(, pos));
sv.(pos + );
}
(!sv.()) tokens.(sv);
tokens;
}


