直接从问题入手,下面这个结构体,占多大内存,也就是求sizeof(A)是多少
struct A
{
int a;
char b;
double c;
};
这就涉及到一个字节对齐的问题,字节对齐有下面这样的规则。
①一个结构体的大小一定是其结构体内成员,最大数据类型的整数倍,因为结构体在分配内存大小的时候是按照最小单位(这个最小单位是我自己取得名字,意思就是最大数据类型)来创建的。
就像上面我举出的一个例子,其中,最大的数据类型是double,double是占8个字节,所以8就是我上面所说的最小单位。
②余下的空间不够了就新开辟一个最小单位的空间,并且从新开辟的地方开始存放变量,不会去用前面用剩下的空间。
就像上面我举出的一个例子,经由①,我们已经知道结构体A的最小单位大小是8,所以,我们一开始在存放int型数据的时候就把int放里面了,然后还剩下4个字节大小的空间,放第二个变量char还够,所以就继续放,至此,我们一共申请的空间只有8,还剩下3个字节大小的空间没有用过,显然,这不够我们8个自己大小的double放了,于是,为了存放double类型的变量,系统就会再去申请一片8字节大小的空间。
至此,我们一共申请了8+8=16字节大小的空间,因此,sizeof(A)也就是16了。
其实字节对齐的重要内容就上面这么些。另外我还想提一句有关位域的知识。
一些数据在存储时并不需要占用一个完整的字节,只需要占用一个或几个二进制位即可。
位域就是限定一个变量占多少位,还有一个规定:位域宽度不能超过它所依附的数据类型的长度
struct A
{
char a : 5;
char b : 4;
char c : 7;
};
结构体的字节对齐规则还是没有变,这里还是按照最大的元素的整数倍去给结构体分配内存,但是由于有了位域,因为其可精确到位,其就可以更加细致得去分配结构体内存空间,可以减少一些不必要的分配间隙。