结构体的内存对齐操作
结构体不像数组,结构体中可以存放不同类型的数据,它的大小也不是简单的各个数据成员大小之和,限于读取内存的要求,而是每个成员在内存中的存储都要按照一定偏移量来存储,根据类型的不同,每个成员都要按照一定的对齐数进行对齐存储,最后整个结构体的大小也要按照一定的对齐数进行对齐。
结构体的内存对齐规则如下:
第一个成员的首地址为0
每个成员的首地址是自身大小的整数倍
结构体的内存总大小是其成员中所含最大类型的整数倍
-
不同类型所占的大小
page3image8887824.png
-
通过一个例子来验证
struct Stru1 {
NSString *str; [0-7] 8
int a; [8 - 11] 4
char b; [12 - 13] 1
long c; [16 - 23] 8 (14不是8的整数倍,要偏移到16)
}; //得出该结构体的大小为24
- 结构体嵌套的情况
struct Stru1 {
NSString *str;
int a;
char b;
long c;
};
struct Stru2 {
int a1; [0-3] 4
NSString *str1; [8-15] 8 (4不是8的整数倍,要偏移到8)
char b1; [16-17] 1
long c1; [24-31] 8 (17不是8的整数倍,要偏移到24)
struct Stru1 s; [32 - xx](32是Stru1里面最大类型的整数倍)
};// 所以Stru2的大小就是32+24
- 打印的结构也是如此
NSLog(@"%lu--%lu",sizeof(struct Stru1),sizeof(struct Stru2));
24--56
网友评论