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

64位系统下两种结构体布局的内存填充机制疑问

64位系统下结构体内存填充与对齐解析

首先明确本次场景的基础参数:64位系统,char占1字节、float占4字节、long占8字节;编译器默认对齐规则为:

  • 结构体的对齐边界等于成员中最大基本数据类型的大小(此处为long的8字节)
  • 每个成员的起始地址必须是自身大小的整数倍
  • 结构体总大小必须是对齐边界的整数倍,不足则在末尾填充

第一个结构体(总大小64字节)

结构体定义:

struct record{
    char name[50];
    float cost;
    long num;
}stu;

内存布局拆解:

  • char name[50]:占用0~49地址,共50字节
  • 填充2字节:float要求起始地址是4的整数倍,49的下一个4的倍数是52,因此在50~51地址填充2字节
  • float cost:占用52~55地址,共4字节
  • long num:float结束于55,下一个8的倍数是56,正好满足long的8字节对齐要求,占用56~63地址,共8字节
  • 总大小:50+2+4+8=64字节,恰好是8的倍数,无需额外末尾填充

第二个结构体(总大小72字节)

结构体定义:

struct record{
    char name[50];
    long num;
    float cost;
}stu;

内存布局拆解:

  • char name[50]:占用0~49地址,共50字节
  • 填充6字节:long要求起始地址是8的整数倍,49的下一个8的倍数是56,因此在50~55地址填充6字节
  • long num:占用56~63地址,共8字节
  • float cost:起始地址64是4的整数倍,满足对齐要求,占用64~67地址,共4字节
  • 填充5字节:当前总大小为50+6+8+4=68字节,需对齐到8的倍数,因此在68~71地址填充5字节,最终总大小为72字节

关键结论

结构体成员的排列顺序直接影响内存填充的字节数。将对齐要求相同或相近的成员放在一起,能有效减少填充字节,优化内存利用率。

内容的提问来源于stack exchange,提问作者Paulson Raja L

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 17:51:27