为什么C++中sizeof(string)无论字符串内容如何始终返回24?
问题原因分析
sizeof是C++编译期运算符,计算的是类型本身在栈空间中占用的固定内存大小,和对象管理的动态堆内存无关。std::string是封装了字符串存储逻辑的容器类,本身是一个栈上的固定大小对象,实际存储的字符串内容要么存在对象内置的小缓冲区,要么存在单独申请的堆内存中,这部分存储内容的内存不会被计入sizeof的运算结果。- 你观测到的24字节固定结果,是64位系统下GNU libstdc++(目前最常用的C++标准库实现)的
std::string布局的默认大小:它采用小字符串优化(SSO)设计,内部总大小为3个指针的长度,64位系统下单个指针占8字节,总大小就是 3*8=24 字节。这24字节空间会被动态复用:当存储的字符串长度≤15字节时,内容直接存放在这24字节的内置缓冲区内,无需申请堆内存;当字符串长度超过阈值时,这部分空间会切换为「堆内存指针+字符串长度+容量」三个字段,指向外部动态申请的内存存储字符串内容。
- 如果要获取字符串实际包含的字符数,应该调用
s.size()成员方法,不要使用sizeof运算符。
内容的提问来源于stack exchange,提问作者Chirag Joshi
相关产品推荐
相关产品推荐

