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
相关产品推荐
相关产品推荐

