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

64位平台下含相似数据的两个结构体sizeof值差异原因问询

为什么64位平台下两个结构体的大小不一样?

这个问题的核心是结构体的内存对齐——这是编译器为了提升CPU访问效率自动做的优化,在64位平台下这个规则的影响会很明显,我给你一步步拆解:

先明确64位平台的基础数据类型大小

在绝大多数64位系统中:

  • int 类型占4字节
  • 指针类型(比如int*)占8字节(因为要存储64位的内存地址)

分析struct node1的大小

struct node1 { int a; int b; int c; };

三个成员都是int,每个4字节,总字节数是4*3=12。根据内存对齐规则,结构体的总大小需要是最大成员对齐要求的整数倍:这里最大成员是int,对齐要求是4字节,12刚好是4的倍数,不需要额外填充字节,所以sizeof(node1)=12,和你的预期一致。

分析struct node2的大小

struct node2 { int* a; int c; };

我们来拆解它的内存布局:

  1. 第一个成员int* a占8字节,从偏移0开始到偏移7结束。
  2. 第二个成员int c的对齐要求是4字节,所以它的起始偏移必须是4的倍数——偏移8刚好满足,所以c占偏移8到11,共4字节。
  3. 到这里已经用了12字节,但别忘了结构体的总大小必须是最大成员对齐要求的整数倍:这里最大成员是int*,对齐要求是8字节。12不是8的倍数,所以编译器会自动补充4个字节的填充(padding),把总大小凑到16(8的2倍)。这就是sizeof(node2)=16的原因。

补充:为什么要做内存对齐?

CPU读取内存是按固定大小的块(比如64位CPU通常按8字节块读取)来操作的,如果一个数据跨了两个块,CPU需要读取两次再拼接,效率会大幅降低。编译器自动添加填充字节,就是为了让每个成员都落在一个读取块内,提升访问效率。

内容的提问来源于stack exchange,提问作者quartz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:38:10