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; };
我们来拆解它的内存布局:
- 第一个成员
int* a占8字节,从偏移0开始到偏移7结束。 - 第二个成员
int c的对齐要求是4字节,所以它的起始偏移必须是4的倍数——偏移8刚好满足,所以c占偏移8到11,共4字节。 - 到这里已经用了12字节,但别忘了结构体的总大小必须是最大成员对齐要求的整数倍:这里最大成员是
int*,对齐要求是8字节。12不是8的倍数,所以编译器会自动补充4个字节的填充(padding),把总大小凑到16(8的2倍)。这就是sizeof(node2)=16的原因。
补充:为什么要做内存对齐?
CPU读取内存是按固定大小的块(比如64位CPU通常按8字节块读取)来操作的,如果一个数据跨了两个块,CPU需要读取两次再拼接,效率会大幅降低。编译器自动添加填充字节,就是为了让每个成员都落在一个读取块内,提升访问效率。
内容的提问来源于stack exchange,提问作者quartz
相关产品推荐
相关产品推荐

