最近做题对于结构体、联合体和类的大小判断,以前对于这些,没有特别的的关注,做题的时候一脸蒙逼,于是想把类,结构体,联合的大小搞清楚!
先看结构体和联合的对齐原则,为了避免混淆,以下均基于32平台,也就是说char类型占1字节,int占4字节,double占8字节:
原则1:数据自身的对齐,它通常是数据类型所占的空间大小,比如int 类型占4个字节,对齐值就是4原则2:整个结构体的对齐,它一般是结构体最大的数据类型所占的空间,比如下面这个结构体的对齐值就是8,因为double类型占8个字节 struct test1 { int a; double b; };对于结构体,按照结构的对齐的规则,先给出几个例子来瞧瞧:
struct A1 { double ss; char str; int aa; }; struct B { char s; double c; int a[9]; };那么我们求A1和B的大小,最终是多少? 根据对齐规则: 先放ss ,它8个字节,也是最大字节,接着放char str,只需要一个字节,最后存储int aa,再放入4个字节,则现在存储需要的空间是:8+1+4 = 13,但是需要整体对齐,需补齐到最大字节数8的倍数。所以sizeof(A1) =16; 同理对于B,最大字节数是8,先放char s,需要补齐至8位,接下来存double c; 最后存储9个int,共36个字节,B总共字节数是8+8+36 = 52;同样的需要对齐,那么sizeof(B)=56;
联合体的规则也不变,只是联合体有个特点,就是每次用的时候只能用一个数据成员,那么对齐的话应该在满足最大需求的同时,满足最大字节数的对齐; 如下例:
union A { int a[7]; char b; double c; }a;最大字节数为8,int a[7]占28个位置,那么需要开辟这么多空间,所以sizeof(A)=32.