iOS|iOS 底层原理探索之内存对齐探究-结构体嵌套结构体
前言
我们都知道内存都是以字节为单位存储的,但是处理器大部分不是按照字节块来存取内存的,它一般会以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中
【iOS|iOS 底层原理探索之内存对齐探究-结构体嵌套结构体】a长度为1字节,a=>[0]结构体对齐总结
A长度为8字节,其中根据对齐原则,MKStruct1中最大成员变量为4字节,应为4的倍数,所以起始位置A=>[4,11]
b长度为1字节,因此b=>[12]
根据对齐原则:结构体总大小是最大成员变量大小的倍数。所以该结构体中最大成员变量为4,总大小为4的倍数,顾:根据对齐原则:该结构体大小为16
结构体总大小是最大成员变量大小的倍数。
结构体嵌套结构体对齐总结
结构体作为结构体成员,其对齐值取其自身成员中最长数据类型的成员的长度的倍数。
总结 内存对齐就是为了更高效合理的利用内存空间而定制的一套规则,简单来说就是一空间换时间的过程。
以上是自己对内存对齐的一些理解,如发现有误欢迎各位大神指点。
未完待续···不断学习,不断更新
推荐阅读
- 做一件事情的基本原理是什么()
- 2020-04-07vue中Axios的封装和API接口的管理
- iOS中的Block
- 【读书笔记】贝叶斯原理
- SG平滑轨迹算法的原理和实现
- 记录iOS生成分享图片的一些问题,根据UIView生成固定尺寸的分享图片
- “写作宝典”《金字塔原理》之读书笔记
- 2019-08-29|2019-08-29 iOS13适配那点事
- Hacking|Hacking with iOS: SwiftUI Edition - SnowSeeker 项目(一)
- 医生随笔(232)不要轻易得罪底层人