我们已经认识了结构体并知道了结构体的一些使用方式,但是,结构体的大小怎么计算呢,直接把成员单独大小加起来?
如用下面这个定义一个结构体s1:
struct Stu
{
int a;
char b;
int c;
};
若只是单独相加的话大小应该是4+1+4=9,但实际上用sizeof()计算出的结果却是12;要弄清楚为什么,我们要先知道结构体的内存对齐:
1)结构体的第一个成员,对齐到结构体在内存中存放位置的0偏移处;
2)从第二个成员开始,每个成员都要对齐到(一个对齐数:结构体成员自身大小和默认对齐数的较小值,在vs下默认对齐数是8;在Liuxn、gcc下没有默认对齐数,对齐数就为成员自身大小)的整数倍数;
通过简单画图就能很容易理解到为什么该结构体大小会为12字节了4+1+4+3=12,中间3个字节因为要对齐所以未被利用,但依然被占用,属于结构体内的大小。
虽然这里12字节确实是该结构体的大小,但是结构体还有一个特点就是,结构体的大小要为占用空间最大的成员的整数倍,该结构体中,最大成员大小为4字节,计算结构体大小为12字节,满足该条件,因而该结构体大小为4字节。