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

64位处理器下结构体内存对齐问题:sizeof结果不符预期

结构体大小计算误区解析

你的代码如下:

struct abc {
    int x;
    int y;
    char a;
    char b;
};

int main() {
    struct abc test;
    printf("%d", sizeof(test));
}

你预期输出是16,但实际得到12,核心原因是误解了C语言的结构体内存对齐规则:

  • 你的环境参数:64位系统,int占4字节,char占1字节。
  • 结构体对齐的核心规则:结构体整体大小必须是其内部最大基本数据类型大小的整数倍,同时每个成员的起始地址需满足自身类型的对齐要求(这里成员中最大的类型是int,对齐单位为4字节)。

具体内存布局拆解:

  1. int x:占4字节,地址范围0-3(符合int的4字节对齐要求)
  2. int y:占4字节,地址范围4-7(起始地址4是4的倍数,满足对齐)
  3. char a:占1字节,地址8(char对齐要求为1字节,任意地址都符合)
  4. char b:占1字节,地址9

此时已使用的总字节数是4+4+1+1=10字节,但结构体整体大小需要是4字节的整数倍,10向上取最近的4的倍数为12,因此编译器会在b后补充2字节填充,最终结构体大小为12字节。

你之前误以为要按64位处理器的8字节读取粒度补6字节,但处理器读取粒度和C语言结构体对齐规则是两回事:处理器能一次读取8字节不代表所有类型都要按8字节对齐,int类型仅需4字节对齐就能保证高效读取,只有当结构体中存在8字节类型(如long long、指针)时,对齐单位才会变为8字节,结构体大小才可能是16字节。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 05:23:18