最近做题对于结构体、联合体和类的大小判断,以前对于这些,没有特别的的关注,做题的时候一脸蒙逼,于是想把类,结构体,联合的大小搞清楚!
先看结构体和联合的对齐原则,为了避免混淆,以下均基于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.