iOS内存分配之堆和栈的区别

时间:2022-05-15 02:26:30

一、内存分区?

       ios内存分为栈区、堆区、全局区、常量区、代码区。

二、各分区介绍

      栈区:是编译器自动分配和释放的。一般存放局部变量、函数参数值得。栈---系统的数据结构,先进先出。

                 分配方式:分为静态分配和动态分配

                 静态分配:编译器完成,局部变量的分批额。

                 动态分配,alloc函数完成。

       堆区:是程序员分配和释放。顺序随意,有点灵活方便。

                  分配方式:只有动态分配的堆,

       全局区:static全局变量和静态变量。初始化的全局变量和静态变量,

                     全局区分为:未初始化的全局区,int a;未初始化,int a  = 10;已经初始化。

       常量区,存放常量字符串,程序结束由程序执行。

       代码区:存放二进制代码。


三、栈和堆的区别

       管理方式:

              1.栈区是由编译器自动分配和释放。

              2.堆区是程序员分配和释放。

       申请效率:

              1.栈区,由系统自动分配,速度较快,但程序员无法控制。

              2.堆区,由alloc分配内存,一般慢,产生内存碎片。

        分配方式

               1.栈区:2种分配方式,静态分配和动态分配,静态分配编译器完成,:局部变量,动态分配是alloc函数进行分配,不需要程序员实现。

               2.堆区:没有静态分配的堆,只有动态分配。

         申请大小:

                1.栈区:是向低地址扩展的数据结构,是一块连续的内存区域,栈顶地址和栈的容量是由系统分配,大小为2M,如果申请的空间大于栈剩余空间,将提示栈溢出。

                 2.堆区:是向高地址扩展的数据结构,是不连续的内存区域,大小受计算机中有效的虚拟内存,比较灵活。