问题描述
给出一个结构体定义,求出这个结构体占用的内存大小
概念铺垫
先解释几个分析需要用到的概念
对齐
将内存划分为很多格子(一个格子占用好几byte),新的数据元素放到新的格子,而不和前面的元素挤到相同的格子里
系统默认值
不同的操作系统会有不同的默认对齐值,比如4
元素默认值
不同元素有自己的一个默认对齐值,比如char为1,int为4,double为8
两次对齐
结构体占用的内存大小由数据元素,数据元素的位置关系,两次对齐的结果共同决定
第一次对齐(结构体内部元素对齐)
对于结构体内每一个元素,首先要确定一个元素对齐值,这个值是系统默认值和元素默认值中较小者
然后将这个元素放在上一个元素之后,第一个能被该值整除的内存位置
比如
char a;
int b;
a放在位置0,占用1,对于b,它的对齐值为4,则只能放在0之后,第一个能被4整除的位置,即位置4,所以a占用0123,b占用4567
第二次对齐(结构体对齐)
对于每一个结构体,首先要确定一个结构体对齐值,这个值是结构体内最大的元素默认值
结构体占用的内存大小必须是这个值的倍数,否则填充字节也要达到下一个该值倍数
比如
int b;
char a;
第一次对齐后,结构体占用5字节,选取结构体对齐值为4,所以结构体大小为5之后第一个4的倍数,即8
特别说明
空结构体占用1字节