最近一直研究结构体占用内存空间大小问题,在网上看了很多文章,很多都是有问题的,所以自己总结了一份,已通过验证,如有问题,请多指教!
编译器环境:keil 5.0
语言:C
结构体占用空间计算要点:双管齐下
1、内部数据对齐
2、整个空间对齐
入题分析:
struct SIZE
{
double a;
int b;
char c;
double d;
};
先不考虑双管齐下计算SIZE数据占用空间,double 8个字节,int 4个字节, char 1个字节,所以一共占用8*2 + 4 + 1 = 21bits但计算机为了存储方便,对结构体数据进行补齐处理,如图所示,涂色部分为数据真正占用的空间,第3个数据char只占用1bit,但分配空间时,给分配了4bits,多余的3个bits就是为了给第四个数据对齐使用。
对齐算法:对齐主要看当前数据偏移量,偏移量首地址如果能除进数据占用空间大小即可表示为对齐,否则补齐处理。
第一个数据a首地址为0,数据位8bits,所以第二个数据首地址为8,可除进第二个数据int型4bits,8 / 4 = 2,所以无需对齐处理,同理,第三个数据也无需处理对齐问题,第四个数据double占用8 bits,首地址为13,不可除进8,所以需要对第三个数据进行对齐处理,13补到16即可除进8,所以第三个数据补3bits,第四个数据偏移量为16,所以整个数据空间为24 bits,符合双管齐下1。结构体内部最大数据double占用8 bits,数据整体占用24 bits,成倍数关系,所以符合双管齐下2。所以,24 bits为SIZE结构体占用的内存空间。
备注:char型数据虽然分配了4 bits,但数据本身只占用1 bits。对齐主要是方便计算机存储方便,不改变数据结构。