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

C语言结构体字节偏移量计算及空间优化问题咨询

C语言结构体字节对齐问题解答

核心规则说明

题目给定对齐规则:K字节的基本数据类型,其偏移量必须是K的倍数;同时结构体总大小必须是结构体中最大对齐单位(此处为8字节)的整数倍。字节偏移量指字段相对于结构体起始地址的字节数,并非所有类型都按最大字节数对齐,而是各自遵循自身的K值要求,直接累加字段大小计算总大小是错误的,因为中间会存在填充字节。


A. 原结构体各字段的字节偏移量

原结构体字段及大小(64位环境下,指针为8字节):

struct
{
char *a; //8 byte
short b; //2 bytes
double c; //8 bytes
char d; //1 byte
float e; //4 bytes
char f; //1 byte
long long g; //8 bytes
void *h; //8 bytes 
} foo;

按对齐规则计算偏移量(含填充字节):

  • a:偏移0(起始地址),占用0~7字节
  • b:偏移8(8是2的倍数),占用8~9字节
  • c:需满足8字节对齐,当前到10字节,需填充6字节(1015),偏移16,占用1623字节
  • d:偏移24(24是1的倍数),占用24字节
  • e:需满足4字节对齐,当前到25字节,需填充3字节(2527),偏移28,占用2831字节
  • f:偏移32(32是1的倍数),占用32字节
  • g:需满足8字节对齐,当前到33字节,需填充7字节(3339),偏移40,占用4047字节
  • h:偏移48(48是8的倍数),占用48~55字节

B. 原结构体的总大小

结构体总大小需对齐到最大对齐单位(8字节)的倍数,当前最后字段h占用到55字节,向上取整为56字节,因此总大小为56字节。


C. 重排结构体以减少空间浪费

将字段按对齐单位从大到小排列(优先放8字节类型,再4字节、2字节、1字节),避免频繁填充:

struct
{
char *a; //8 byte
double c; //8 bytes
long long g; //8 bytes
void *h; //8 bytes 
float e; //4 bytes
short b; //2 bytes
char d; //1 byte
char f; //1 byte
} foo;

重排后的字段偏移量:

  • a:偏移0,占用0~7字节
  • c:偏移8(8是8的倍数),占用8~15字节
  • g:偏移16(16是8的倍数),占用16~23字节
  • h:偏移24(24是8的倍数),占用24~31字节
  • e:偏移32(32是4的倍数),占用32~35字节
  • b:偏移36(36是2的倍数),占用36~37字节
  • d:偏移38(38是1的倍数),占用38字节
  • f:偏移39(39是1的倍数),占用39字节

重排后的总大小:需对齐到8字节的倍数,当前到39字节,向上取整为40字节,因此总大小为40字节。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 07:00:55