天天看点

IOS 内存空间堆 栈 全局区 代码区 数据区

面试经常会问道的一道题。一般课程中介绍的都比较笼统,下面看一下简单的划分

IOS 内存空间堆 栈 全局区 代码区 数据区

其实培训课程中,这样简单的划分是有问题的。下面我们一起来看一下真正的内存区域,以及每个区域的重点。

1.栈区(stack) 由编译器自动分配并释放,存放函数的参数值,局部变量等。栈是系统数据结构,对应线程/进程是唯一的。优点是快速高效,缺点时有限制,数据不灵活。[先进后出]

栈空间分静态分配 和动态分配两种。

IOS 内存空间堆 栈 全局区 代码区 数据区

这里会经常问到auto和static的区别,如果笼统的回答,auto是默认的,static是静态的。那100分只有10分,如果能从内存空间的角度去答,才能让面试官满意。具体可参考上一篇详解static的文章,上面这段话加上static的文章详解。就可以满分了

文章地址:https://blog.csdn.net/lee727n/article/details/80196045

堆区(heap) 由程序员分配和释放,如果程序员不释放,程序结束时,可能会由操作系统回收 ,比如在ios 中 alloc 都是存放在堆中。

IOS 内存空间堆 栈 全局区 代码区 数据区

优点是灵活方便,数据适应面广泛,但是效率有一定降低。

IOS 内存空间堆 栈 全局区 代码区 数据区

虽然程序结束时所有的数据空间都会被释放回系统,但是精确的申请内存,释放内存匹配是良好程序的基本要素。

3.全局区(静态区) (static) 全局变量和静态变量的存储是放在一起的,初始化的全局变量和静态变量存放在一块区域,未初始化的全局变量和静态变量在相邻的另一块区域,程序结束后有系统释放。

4.文字常量区 存放常量字符串,程序结束后由系统释放;

5.代码区 存放函数的二进制代码

IOS 内存空间堆 栈 全局区 代码区 数据区
IOS 内存空间堆 栈 全局区 代码区 数据区
IOS 内存空间堆 栈 全局区 代码区 数据区

继续阅读