这是一个简单的结构体
struct{
char a;
double b;
int c;
short d;
}struct1;
NSLog(@"%lu",sizeof(struct1));
输出为:
24
先看一下对其规则
1.数据成员对⻬规则:结构(struct)(或联合(union))的数据成员,第
一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始储。
区分有没有子成员的情况
没有子成员:
//从0开始第一个位置
struct memberOne{
char a; [0] //1 第一个元素在offset为0的位置
double b; [8,15] //char先补足到8,从8的位置开始放
int c; [16,19]//16正好是4的倍数,直接放
short d; [20,21] //20正好是2的倍数,直接放
}; [23]//整体必须是最大子成员8的倍数,需要补到23
图解:
截屏.png
2.如果一个结构里有某些结构体成员,则结构体成员要从
其内部最大元素大小的整数倍地址开始存储.(struct a里存有struct b,b
里有char,int ,double等元素,那b应该从8的整数倍开始存储.)
有子成员
struct memberTwo{
char a; //1
double b; //8
int c; //4
short d; //2
}; //24
struct memberOne{
char a; //1
double b; //8
int c; //4
short d; //2
struct memberTwo e;//24
}member1; //48
NSLog(@"%lu",sizeof(member1));
输出:
48
图解:
截屏.png
因为多了一个memberTwo, memberTwo成员中的最大子成员是double size=8,所以要满足8的倍数
3.结构体的总大小,也就是sizeof的结果,.必须是其内部最大成员(如果有子成员,参考规则2)的整数倍.不足的要补⻬对齐
- 在iOS下是结构体是8字节对齐
- OC对象申请的内存是8字节对齐,但是系统开辟的内存空间是16字节对齐,
网友评论