GCC结构体内变量对齐

本文探讨了GCC编译器在结构体内分配变量时的内存对齐原则,通常以结构体中最大变量长度为单位进行分配。通过实例展示了如何使用`#pragma pack(n)`指令和`__attribute__((packed))`来调整对齐方式,同时指出避免使用这些指令以保持代码清晰。结构体内部数组、内嵌结构体和typedef变量不被视为整体考虑对齐。最后提到了`__attribute__((aligned (n)))`用于指定整个结构体边界对齐。
摘要由CSDN通过智能技术生成


记不清结构体内分配 变量 对齐方式 ,用GCC简单验证一下,回想起来。很基本的东西 ,很多人有误区 ,又是变量,又 是边界 弄的很乱。

结构体内变量 分配的原则很简单:编译器从结构体第一个变量开始按顺序编译,用一个固定大小n的倍数分配,遇到一个变量的时候,当前n中空余空间足够,就不重新分配,如果这个n倍不够了,它就从上一个n边界开始,再以n的倍数分配适合大小,最小是n,新变量在新空间分配,因此产生空洞,直到结束。最后用边界对齐值(aligned)对齐对齐程序的下一个结构或变量。

这个n的大小可以测试出来。GCC 默认是以结构体中占用字节最多的变量长度为单位(最大是8)。比如结构体中只有char,它以1字节为单位。一般来说结构体中会有int类型,这时多是以4字节为单位。如果有long long 类型,就以8字节为单位。如果结构体内存在long double 类型变量,仍以8字节为单位分配内存,虽然这个long double在GCC中占用12字节。也可以用编译器指令:如#pragma pack(n) 这个形式,指定以n为单位对齐变量,n取值同样是4种:1,2,4,8。

默认结构体内部的数组,内嵌的结构体,typedef 变量,并不视为整体计算。也就是只按它内部变量的情况考虑。

分配时,无论指定多大n分配空间,变量都有它自己的对齐字节,char 1字节对齐,short 2字节对齐,int 4字节对齐。比如一个char ,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值