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

关于C++结构体sizeof计算与内存填充的疑问

C++结构体内存填充问题解答

你的理解不完全准确,实际的内存填充位置和数量和你想的不一样,下面结合你的代码详细分析:

你的结构体内存布局拆解

主流x86/x64平台下,int和float的大小为4字节,对齐要求为4字节;char大小为1字节,对齐要求为1字节。你的StudentRecord结构体内存布局如下:

  • firstName(char[9]):占用地址0-8,共9字节
  • lastName(char[9]):占用地址9-17,共9字节,此时已用内存18字节
  • 填充2字节:下一个成员id是int,要求起始地址是4的倍数,18不是4的整数倍(18%4=2),因此在lastName后填充2字节(地址18-19),将起始地址推到20
  • id(int):占用地址20-23,共4字节
  • gpa(float):占用地址24-27,共4字节(24是4的倍数,符合对齐要求)
  • currentHours(int):占用地址28-31,共4字节
  • totalHours(int):占用地址32-35,共4字节

最终总大小为36字节,刚好是结构体最大对齐单位(4字节)的整数倍(36/4=9),无需额外末尾填充。

内存填充的具体过程

编译器会遵循内存对齐规则优化CPU的内存访问效率,具体步骤如下:

  1. 确定对齐要求:
    • 基本数据类型的对齐要求通常等于自身大小(如char=1,int=4,double=8,不同平台可能有差异)
    • 数组的对齐要求与元素类型一致
    • 结构体的对齐要求是其所有成员中最大的对齐要求
  2. 逐个放置成员:
    从结构体起始地址开始,依次为每个成员分配内存。如果当前可用地址不符合该成员的对齐要求,就插入填充字节,直到地址满足对齐条件。
  3. 调整总大小:
    结构体的总大小必须是其对齐要求的整数倍,如果当前总大小不满足,就在结构体末尾添加填充字节。

内存填充的核心目的是提升CPU访问效率:CPU通常按固定字长(如4字节、8字节)读取内存,未对齐的数据需要CPU分两次读取并拼接,会降低性能;对齐后可以一次完成读取,效率更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 11:52:34