string的两种实现
1. 内存布局对比(32位系统)
(1) MSVC
-
Debug 模式:28 字节
cpp
union {char _Buf[16]; // 短字符串缓冲区(SSO)char* _Ptr; // 长字符串指针 } _Bx; // 16字节 size_t _Mysize; // 4字节:字符串长度 size_t _Myres; // 4字节:容量 _Container_proxy* _Proxy;// 4字节:调试信息(仅Debug)
-
Release 模式:24 字节(移除
_Proxy
和填充)
SSO 容量:15 字符 +\0
(存于_Buf[16]
)。
(2) GCC
-
所有模式:12 字节
cpp
struct {char* _M_p; // 堆指针或短字符串数据(前4字节)size_t _M_length; // 4字节:长度(低1字节表示,最大为15) + 字符(高3字节)size_t _M_capacity; // 4字节:字符或容量 };
SSO 容量:15 字符+ \0(复用所有字段存储,并且会突破结构体边界来写入)。
2. 核心差异
特性 | MSVC | GCC |
---|---|---|
SSO 缓冲区 | 固定 _Buf[16] | 复用 _M_p 、_M_length 、_M_capacity |
内存占用(32位) | Debug 28B / Release 24B | 固定12B |
越界风险 | 无(严格边界) | 有(12字节存16字节数据) |
设计目标 | 调试友好、稳定性 | 极致性能、内存效率 |
长度存储 | 显式 _Mysize 字段 | _M_length 低字节 + 高位标志 |
3. SSO 优化对比
编译器 | 短字符串存储方式 | 最大短字符串长度 |
---|---|---|
MSVC | 独立 _Buf[16] | 15 + \0 |
GCC | 复用所有字段,\0 嵌入未用空间 | 15 + \0 |
-
MSVC:安全但内存占用大。
-
GCC:高风险高回报,性能极致优化。