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

64位系统下C语言示例2结构体大小为6字节而非8字节的原因咨询

结构体对齐与大小计算规则

你对尾部填充的计算逻辑存在错误,先明确两个主流64位编译器默认配置下通用的对齐规则:

  • 结构体中每个成员的起始偏移量,必须等于该成员自身对齐值的整数倍,不满足时在当前成员和前一个成员之间填充字节对齐
  • 结构体的总大小,必须是当前结构体所有成员里对齐要求最高的那个值的整数倍,不满足时在最后一个成员尾部补填充字节,不需要额外对齐到更高的字节数。

示例1大小为12字节的计算逻辑

对应代码:

struct
{
    uint8 a;
    uint32 b;
    uint8 c;
}ABC;

逐成员偏移计算:

  • uint8 a对齐要求为1字节,从偏移0位置开始存放,占1字节,当前已用长度到偏移1
  • 接下来存放uint32 b,对齐要求为4字节,当前偏移1不满足4的整数倍要求,补3字节填充到偏移4位置,b占4字节,当前已用长度到偏移8
  • 接下来存放uint8 c,对齐要求为1字节,直接从偏移8位置开始存放,占1字节,当前已用长度到偏移9
  • 此时检查总长度要求:该结构体中对齐要求最高的成员是uint32 b,对齐值为4,9不是4的整数倍,因此在c尾部补3字节填充,总长度到12,刚好是4的整数倍,满足要求,和你实测结果一致。

示例2大小为6字节的原因

对应代码:

struct
{
    uint8 a;
    uint16 b;
    uint8 c;
}ABC;

逐成员偏移计算:

  • uint8 a对齐要求为1字节,从偏移0位置开始存放,占1字节,当前已用长度到偏移1
  • 接下来存放uint16 b,对齐要求为2字节,当前偏移1不满足2的整数倍要求,补1字节填充到偏移2位置,b占2字节,当前已用长度到偏移4
  • 接下来存放uint8 c,对齐要求为1字节,直接从偏移4位置开始存放,占1字节,当前已用长度到偏移5
  • 此时检查总长度要求:该结构体中对齐要求最高的成员是uint16 b,对齐值为2,5不是2的整数倍,因此只需要在c尾部补1字节填充,总长度到6,刚好是2的整数倍,完全满足对齐要求。

你之前的错误是默认所有结构体尾部都要补3字节凑到8字节长度,但实际上示例2的结构体里根本没有对齐要求为4或8字节的成员,最高对齐要求只有2字节,根本不需要凑到8字节长度,6字节已经完全满足所有对齐规则,这就是编译器返回大小为6的原因。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 01:36:32