美文网首页
iOS 结构体内存对齐分析

iOS 结构体内存对齐分析

作者: 小糾丶羯 | 来源:发表于2020-09-08 16:40 被阅读0次

    一、结构体

    结构体,我们可以将它当做一种数据类型,并且是一个集合类的数据类型,它的数据成员可以是基础数据类型(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

    相关文章

      网友评论

          本文标题:iOS 结构体内存对齐分析

          本文链接:https://www.haomeiwen.com/subject/psgdektx.html