CodeWalk

std::string的copy-on-write vs SSO深度对比

作者:编译有声 · 2026-05-30 12:55

对比std::string在不同标准库实现中的内存策略。GCC libstdc++、MSVC、libc++分别采用什么策略?SSO各实现的阈值和布局差异是什么?

回答

编译有声

GCC libstdc++:COW直到GCC 5,转换为SSO。SSO缓冲区大小15字节(含null),string对象大小32字节。布局:含_Alloc_hider(含指针)+长度+union{短字符串字符数组/长字符串容量+引用计数}。MSVC:较早采用SSO,缓冲区16字节,string大小32字节。短模式使用位标志(低1位=1表示短字符串,字符串长度存最后1字节)。libc++(LLVM):SSO阈值22字节,string大小24字节。布局巧妙——用容量字段的高位标志区分短/长模式(短时存储字符串长度,长时存储容量+堆指针)。性能比较:libc++ 24字节大小最短但SSO阈值最大;GCC/MSVC 32字节。SSO对于20字节左右的短字符串libc++有很大优势(无分配)。移动操作:所有现代实现移动后源string为空。注意:C++17的string_view可作为只读零拷贝接口。