32位系统下结构占用21字节疑问:3指针+2数值为何不是20字节?
32位系统下该结构占用21字节的原因
你按5*4=20计算是基于普通C结构体4字节对齐的思路,但这里的结构是Redis的压缩列表(ziplist),它的内存占用逻辑和普通结构体完全不同:
- ziplist是专为节省内存设计的紧凑数据结构,不遵循固定字节对齐规则,而是根据元素实际内容动态编码存储。
- 完整ziplist的组成部分:
zlbytes:4字节,记录整个压缩列表的总字节数zltail:4字节,记录最后一个元素到列表起始位置的偏移量zllen:2字节,记录列表内的元素个数- 元素条目:每个元素的存储长度按需编码,比如小整数仅需1字节存储,而非固定4字节
zlend:1字节,标记压缩列表结束,固定为0xFF
以你的场景为例,若2个数值是小整数(各占1字节),3个元素的编码总长度为6字节,再加上各固定部分和结束标记,总长度就是4+4+2+6+1=21字节。
普通结构体的对齐规则不适用于ziplist,它通过动态编码和紧凑存储实现内存最小化,因此实际占用字节数会和固定成员大小的计算结果存在差异。
内容的提问来源于stack exchange,提问作者hello
相关产品推荐
相关产品推荐

