一、结构体
结构体,我们可以将它当做一种数据类型,并且是一个集合类的数据类型,它的数据成员可以是基础数据类型(int、double、float、bool等),也可以是指针,甚至于是其他的结构体。
下面是一个结构体的定义示例:
struct XBPerson {
NSString *name;
int age;
} person;
二、结构体的size大小
既然结构体作为一个集合类的数据类型,可以存储不同的数据,那它的size大小是怎么计算的呢?
1、一些数据类型占用的内存大小
2、内存对齐的原则
1.数据成员对齐规则:第一个数据成员的起始位置是0,之后数据成员的起始位置必须是成员自身大小的整数倍
2.结构体作为成员:该结构体成员的起始位置必须是其内部最大成员大小的整数倍
3.收尾工作:结构体的总大小(sizeof),必须是其内部最大成员大小的整数倍,不足的需要补齐。
三、分析
1、一般结构体分析
首先定义一个结构体Struct1,如下:
struct Struct1 {
double a; //8字节
char b; //1字节
int c; //4字节
short d; //2字节
} struct1;
结合内存对齐的原则,我们对这个结构体进行分析:
1、a,是double类型,占用了8个字节的内存,并且是第一个数据成员,所以a的起始位置是0,范围是[0,7]。
2、b,是char类型,占用了1个字节的内存,所以b的起始位置是8(8是1的整数倍),范围是[8]。
3、c,是int类型,占用了4个字节的内存,所以c的起始位置是12(9、10、11都不是4的整数倍,故从12开始),范围是[12,15]。
4、d,是short类型,占用了2个字节的内存,所以d的起始位置是16,范围是[16,17]。
所以当前结构体Struct1需要的大小是[0,17],也就是18字节。但是根据原则3,Struct1中最大成员是double(大小8字节),18不是8的整数倍,必须补齐,所以最终Struct1的大小是24。
这里我们代码实际操作一下:如图:
一般结构体size 2、结构体嵌套结构体分析1、首先定义一个结构体Struct2,如下:
struct Struct2 {
double a; //8字节
char b; //1字节
double c; //8字节
struct Struct1 struct1;
} struct2;
2、a、b、c分析同上,其中c的范围是[12,19],至于数据成员结构体struct1的起始位置,根据原则2(结构体成员的起始位置必须是其内部最大成员大小的整数倍,也就是double 8字节的整数倍),20无法满足条件,所以struct1的起始位置是24,范围是[24,47],所以struct2的范围是[0,47],大小为48。
这里我们代码实际操作一下:如图: 结构体嵌套结构体size
网友评论