美文网首页
iOS 底层原理探索之内存对齐探究-结构体嵌套结构体

iOS 底层原理探索之内存对齐探究-结构体嵌套结构体

作者: Meek_L | 来源:发表于2020-09-09 10:49 被阅读0次

前言

我们都知道内存都是以字节为单位存储的,但是处理器大部分不是按照字节块来存取内存的,它一般会以2字节,4字节,8字节,16字节甚至32字节为单位来存取内存,我们将上述这些存取单位称为内存存取粒度.

我们先来简单看下结构体中不同元素类型所占空间大小,方便我们后面的探究


image.png

对象的内存对齐 --> 来自于结构体
结构体对其原则是:首先找到最大的成员变量,结构体总大小是最大成员变量大小的倍数。

普通结构体

例1

typedef struct{
    char a;   //1字节
    int b;    //4字节
    char c;   //1字节
} MKStruct;

sizeof(MKStruct) = 12

根据上面结构体代码我们可以分析得出下面的内存存储结构


image.png

解析:

1.第一个成员变量放在offset为0的地方,按照字节大小 a为1字节大小 [0]。
2.接下来的成员变量起始位置应该是该成员大小的倍数,b为int类型4字节,所以起始位置应该是从4开始 [4,7].
3.c为1字节,8为1的倍数,所以c的位置[8]
4.根据结构体对齐原则:结构体总大小是最大成员变量大小的倍数。所以该结构体中最大成员变量为4,总大小为4的倍数,顾:根据对齐原则:该结构体大小为12。

通过上面的例子我们了解了什么是结构体对齐
下面我们再看几个列子增进理解:
例2

typedef struct {
    char a;     //1字节
    int b;      //4字节
    char c;     //1字节
    double d;   //8字节
} MKStruct;

sizeof(MKStruct) = 24
image.png

解析:

a长度为1字节,a=>[0]
b长度为4字节,起始位置应为4的倍数,所以offset+3=4,b=>[4,7]
c长度为1字节,8是1的倍数,因此c=>[8]
d长度为8字节,起始位置应为8的倍数,offset=9不行,所以offset+7 = 16为8的倍数,因此d=>[16,23]
根据对齐原则:结构体总大小是最大成员变量大小的倍数。所以该结构体中最大成员变量为8,总大小为8的倍数,顾:根据对齐原则:该结构体大小为24
例3

typedef struct {
    char a;     //1字节
    char c;     //1字节
    int b;      //4字节
    double d;   //8字节
} MKStruct;

sizeof(MKStruct) = 16
image.png

解析:

a长度为1字节,a=>[0]
b长度为1字节,起始位置应为1的倍数,b=>[1]
c长度为4字节,起始位置应为4的倍数,因此c=>[4,7]
d长度为8字节,起始位置应为8的倍数,offset=8是8的倍数,因此d=>[8,15]
根据对齐原则:结构体总大小是最大成员变量大小的倍数。所以该结构体中最大成员变量为8,总大小为8的倍数,顾:根据对齐原则:该结构体大小为16

注:根据上面两个例子我们发现,同样的属性情况,但是开辟的内存不一样,尽管我们在内存中采用了内存对齐的方式,但并不是所有的内存都可以进行浪费的,苹果会自动对属性进行重排,以此来优化内存。

结构体嵌套结构体

struct struct {
    char a;        //1字节 
    char b;      //1字节 
    int c;         //4字节  
} MKStruct1;

struct struct {
    char a;        //1字节
    MKStruct1 A;
    char b;         //1字节
} MKStruct2;

sizeof(MKStruct1) = 8;
sizeof(MKStruct2) = 16;
image.png
image.png

解析:
MKStruct2中

a长度为1字节,a=>[0]
A长度为8字节,其中根据对齐原则,MKStruct1中最大成员变量为4字节,应为4的倍数,所以起始位置A=>[4,11]
b长度为1字节,因此b=>[12]
根据对齐原则:结构体总大小是最大成员变量大小的倍数。所以该结构体中最大成员变量为4,总大小为4的倍数,顾:根据对齐原则:该结构体大小为16

结构体对齐总结

结构体总大小是最大成员变量大小的倍数。

结构体嵌套结构体对齐总结

结构体作为结构体成员,其对齐值取其自身成员中最长数据类型的成员的长度的倍数。

总结

内存对齐就是为了更高效合理的利用内存空间而定制的一套规则,简单来说就是一空间换时间的过程。

以上是自己对内存对齐的一些理解,如发现有误欢迎各位大神指点。
未完待续···不断学习,不断更新

相关文章

  • iOS 底层原理探索之内存对齐探究-结构体嵌套结构体

    前言 我们都知道内存都是以字节为单位存储的,但是处理器大部分不是按照字节块来存取内存的,它一般会以2字节,4字节,...

  • 结构体

    结构体有名定义 无名定义 结构体嵌套定义 结构体内存对齐 结构体成员初始化 结构体变量引用 结构体的有名定义:直白...

  • iOS 底层原理--- 结构体-内存对齐

    前言

  • iOS-内存对齐

    先上个图,待会计算内存时会用到。 hxdm,已知iOS对象的本质是结构体,所以探索内存对齐当然是从结构体开始啦。来...

  • iOS原理探索02-- 内存对齐

    结构体内存对齐 我们首先定义两个结构体,分别计算他们的内存大小,并讨论内存对齐原理 从两个结构体来看两者没啥大的区...

  • iOS-底层原理04-结构体嵌套结构内存对齐

    《iOS底层原理文章汇总》[https://www.jianshu.com/p/15af435341ce] 类分析...

  • 二、 字节对齐

    探索OC类的大小要先来说一下结构体,因为OC类底层都是以结构体的形式存在的。 1 结构体大小-字节对齐 我们先定义...

  • 结构体内存对齐

    前言 OC语言底层是基于c和c++的,而NSObject在底层也是用结构体实现的,所以了解了结构体的内存对齐问题对...

  • iOS底层-结构体指针内存对齐

    前言 iOS开发中,我们称万物皆对象,对象的本质又是什么呢?项目开发中我们也常常说到内存的分配,程序又是如...

  • 结构体

    1.结构体 2.结构体的内存对齐模式 编译器在编译一个结构的时候采用内存对齐模式,结构体总是以最大的成员最为对齐单...

网友评论

      本文标题:iOS 底层原理探索之内存对齐探究-结构体嵌套结构体

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