今天把操作符sizeof用了个遍,各种类型基本都用了,最后发现结构体类型最麻烦。下面直接进入主题:
(1)先是定义了如下结构体:
struct{
char a;
int i;
double d;
}text;
然后用sizeof(text),预期结果是1+2+8 = 11???如果这样想就错了,答案是16.
(2)然后,换一下变量的顺序:
struct{
char a;
double d;
int i;
}text;
猜猜答案是多少?11?16?错,答案是24
(3)再换个顺序:
struct{
double d;
char a;
int i;
}text;
又开始猜答案了,11?16?24?这次终于蒙对了,答案是16
也许有人会问,同一个结构体,就是变量顺序的不同,为什么大小会有如此大的差别?下面就慢慢来解释。
在存储过程中,为了提高CPU的存储速度,编译器会对变量的起始地址做“对齐”处理。VC规定结构体的各变量存放的起始地址相对于结构体的起始地址的偏移量必须是该变量的类型所占字节数的倍数,并且整个结构体的字节数必须是该结构体中占用空间最大的类型的字节数的整数倍。所以上述3个结构体实际分配情况如下:
(1)1000 1111 11111111(0表示补充位)
首先,为char类型的a分配,由于是第一个,相当于起始地址是0,是sizeof(char)的整数倍,分配一位;接着,为int类型的i分配,其字节数是4,与起始地址的偏移量是1,不是4的整数倍,于是补充3个填充位,再为i分配4位;最后,为double类型的d分配,其字节数是8,与起始地址的偏移量是8,刚好是整数倍,于是接着分配8位,整个结构体就占16位。
(2)1 0000000 11111111 1111 0000 (由于20不是8的整数倍,最后还会补充4位,共计24位)
(3)11111111 1000 1111(共计16位)