结构体内存对齐

2020-09-08  本文已影响0人  浪的出名

结构体的内存对齐操作

结构体不像数组,结构体中可以存放不同类型的数据,它的大小也不是简单的各个数据成员大小之和,限于读取内存的要求,而是每个成员在内存中的存储都要按照一定偏移量来存储,根据类型的不同,每个成员都要按照一定的对齐数进行对齐存储,最后整个结构体的大小也要按照一定的对齐数进行对齐。

结构体的内存对齐规则如下:

第一个成员的首地址为0
每个成员的首地址是自身大小的整数倍
结构体的内存总大小是其成员中所含最大类型的整数倍
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
上一篇 下一篇

猜你喜欢

热点阅读