记不清结构体内分配 变量 对齐方式 ,用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 ,