为何两个不同C++类对象的内存占用大小相同?
问题:Trie与Trie2类的sizeof结果为何相同?
运行以下C++代码后,Trie与Trie2类的sizeof输出均为216字节。能理解Trie类的计算逻辑(4字节int + 4字节填充 + 26×8字节指针数组),但无法理解Trie2类的内存占用为何与之相同,原本预期两者结果不同。
#include <bits/stdc++.h> using namespace std; class Trie{ int a; Trie * child[26]; }; class Trie2{ int a; char b; Trie * child[26]; }; int main() { cout<<sizeof(Trie)<<endl; cout<<sizeof(Trie2)<<endl; return 0; }
解答
这是内存对齐规则导致的结果,核心原因是64位系统下指针大小为8字节,类的内存对齐单位会取成员中最大的基本类型大小(这里是8字节)——即整个类的总大小必须是8的倍数,同时成员变量之间也需要满足对齐要求:
Trie类的内存布局:int a占4字节,接下来要存放8字节的指针数组,为了对齐到8字节边界,需要填充4字节,凑够8字节的对齐块。- 26个指针每个占8字节,总大小为
26×8=208字节。 - 总大小:
4+4+208=216字节,刚好是8的倍数,无需额外填充。
Trie2类的内存布局:int a占4字节,char b占1字节,两者合计5字节。接下来要存放8字节的指针数组,同样需要对齐到8字节边界,所以需要填充3字节(5+3=8)。- 指针数组的大小依然是208字节。
- 总大小:
4+1+3+208=216字节,同样是8的倍数,和Trie类的总大小完全一致。
简单来说,Trie2里新增的char b刚好占用了原本Trie中填充的4字节里的1个,剩下的填充字节从4变成了3,总占用的对齐块大小还是8字节,所以最终整个类的大小没有变化。
内容的提问来源于stack exchange,提问作者user762007
相关产品推荐
相关产品推荐

