You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何两个不同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的倍数,同时成员变量之间也需要满足对齐要求:

  1. Trie类的内存布局:

    • int a占4字节,接下来要存放8字节的指针数组,为了对齐到8字节边界,需要填充4字节,凑够8字节的对齐块。
    • 26个指针每个占8字节,总大小为26×8=208字节。
    • 总大小:4+4+208=216字节,刚好是8的倍数,无需额外填充。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 07:55:58