结构体的大小——结构体对齐问题

本文介绍了C语言中结构体的对齐规则及其与编译器的关系,通过实例解析了GCC编译器下结构体成员如何按指定对齐数值排列,并讨论了不同对齐数值的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C语言中,基本数据类型与操作系统有关(虽然直接与编译器相关),基本没有什么变化。比如在32位操作系统中,int占4个字节,long占4个字节,char占1个字节,double占8个字节。但是结构体的大小并不只与操作系统有关了,与编译器有比较大的关系。
不同的编译器有不同的对齐方式,下面以32为linux下gcc4.6为例,分析一下gcc中结构体对齐的问题。

C中可以使用#pragma pack(n)来手动设定对齐数值。gcc默认是4,即按照4字节对齐。一般有如下的对齐规则:
1、结构体的第一个数据成员的相对位置为0,后续数据成员按n指定的值和该数据成员自身大小中较小的那个进行对齐。
2、不仅需要数据成员对齐,结构体本身也需要对齐。按照n的值和结构体数据成员中最长的长度中较小的进行对齐。结构体本身对齐即结构体最终的大小须是对齐数值的倍数,且不小于所有数据成员对齐之后的和。
对齐也即意味着数据的相对地址开始值须是对齐数值的倍数。
struct test {
int i;//4
char c;//1
long l;//4
double d;//8
}

i占4字节,c占1字节,l占4字节,d占8字节,使用默认对齐数值4。按照第一条规则,对于i,4=n,按4对齐,则i占据[0,3];对于c,1<n,按1对齐,则c占据[4];对于l,4=n,按4对齐,则l占据[8-11];对于d,8>n,按n=4对齐,则d占据[12-19]。至此数据成员对齐完毕,占据了[0-19]共20个字节。
接着按照规则2进行结构体本身的对齐。结构体数据成员中最大的是d,占了8个字节,n默认为4,故按照最小值4进行对齐。12是4的倍数,且最接近数据成员大小之和。故此结构体最终的大小是20。
#pragma pack(n)中n的值之可能是1、2、4。可以用3试一下,编译器回报错。如果用8,编译器不会报错,但是按照规则计算的大小与实际的大小不一致,因为gcc又按照默认的4进行对齐了,可以测试一下,这里不再赘述。
n=1,n=2的情况与n=4的情况类似,按照规则对齐即可,略。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值