结构体是我们再熟悉不过的一种结构,是由一系列具有相同类型或不同类型的数据构成的数据集合。但它的大小并不是简单的将所有的成员大小相加哦。接下来我们讨论一下结构体的大小将如何计算。
首先需要明确一个相关的概念————偏移量。偏移量指的是结构体变量中成员的地址和结构体变量地址的差。
结构体大小等于最后一个成员的偏移量加上最后一个成员的大小。
用以下的例子说明:
struct one
{
int a;
char b;
int c;
};
结构体中第一个成员的地址就是结构体变量的首地址。因此,a的偏移量为0。b的偏移量是第一个成员的偏移量加上第一个成员的大小0+4=4;cj的偏移量是第二个成员的偏移量加上第二个成员的大小 4+1=5。
存储变量时要求地址对齐 ,编译器在编译程序时会遵循以下原则:
一、结构体变量中成员的偏移量必须是成员大小的整数倍(0被认为是任何数的整数倍)
二、结构体大小必须是所有成员大小的整数倍。
第三个成员的偏移量为5,并不是自身(int)大小的整数倍。编译器在处理时会在第二个成员后面补上3个空字节,使得第三个成员的偏移量变成8。
上面的例子中计算出来的大小为12
所以不同的定义顺序会影响到结构体的大小,故在定义结构体时要考虑到字节对齐。