【iOS】内存管理五大区( 二 )


验证结果:

【iOS】内存管理五大区

文章插图
可知:
静态变量与全局变量未初始化储存在静态区(.BSS段),地址连续;静态变量与全局变量初始化储存在数据区(.data段),地址连续;静态变量与全局变量初始化前后储存地址不变,说明其储存区域一开始便决定,之后不再改变;静态区(.BSS段)与数据区(.data段)地址连续,其划分并不严格(其划分应该是动态的),完全可以当作一个区域 。3.1.2 常量保存的内存区域
常量保存在常量区 。
给前面的验证代码加一个常量:
// 设置两个全局变量,一个初始化,一个不初始化int num1 = 1;int num2;int main(){@autoreleasepool {NSLog(@"num1 pointer = %p", &num1);NSLog(@"num2 pointer = %p", &num2);// 初始化num2num2 = 2;NSLog(@"init num2 pointer = %p", &num2);// 设置两个静态变量,一个初始化,一个不初始化static int sNum1 = 1;static int sNum2;NSLog(@"sNum1 pointer = %p", &sNum1);NSLog(@"sNum2 pointer = %p", &sNum2);sNum2 = 2;NSLog(@"init sNum2 pointer = %p", &sNum2);// 常量const int cNum = 3;NSLog(@"cNum pointer = %p", &cNum);}}
结果:
【【iOS】内存管理五大区】可知:
常量与静态变量、全局变量不在一个区域保存,常量保存在常量区 。3.2 静态区
储存静态变量和全局变量,是否在一开始便初始化决定它们储存在.BSS段还是.data段,一经决定不再更改 。
3.3 常量区
储存常量,不论是否初始化 。
4.
以下是三种系统针对内存管理优化做出的方案
首先就是我们说到的,推荐大家去看下官方提供的视频WWDC 2020,里面有详细解释为什么会使用到,总结以下几点
专门用来存小数据 ,通过高位直接判断数据类型,例如,,g字符串小对象并没有进堆区,值直接存在指针,而不是想常规数据,指针存地址,所以实际上它不是一个对象,只是一个普通变量而已,没存在堆中,自然也不需要和free内存读取3倍效率,创建速度快106倍
这是使用的大致范围,如图