zoukankan      html  css  js  c++  java
  • ios内存五大区域

    1.栈区(stack)由编译器自动分配并释放,存放函数的参数值,局部变量等。栈是系统数据结构,对应线程/进程是唯一的。iphone的栈区只有512K,其操作方式类似于数据结构中的栈

     优点:快速高效

     缺点:有限制,数据不灵活[先进后出]

     2.堆区(heap)由程序员分配和释放,如果程序员不释放,程序结束后,可能由操作系统回收。类似于链表

     优点:灵活方便,数据适应面广泛

     缺点:效率有一定降低

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

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

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

     栈和堆申请大小的限制:

     栈是向低地址扩展的数据结构,是一块连续的内存区域。栈的地址和最大容量是系统预先规定好的。如果申请的空间超过了栈的剩余空间的时候,将提示overFlow,因此,能从栈获得的空间较小。

     堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。操作系统对于堆是采用链表进行管理的。操作系统有一个记录空闲内存地址的链表,当收到程序的请求时,会遍历该链表,寻找第一个空间大于所申请空间的堆节点,然后将该节点从空闲节点链表中删除,并将该节点的空间分配给程序。由于找到的堆节点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。

     碎片的问题:

     栈:由系统自动分配,速度较快,不会产生内存碎片,因为栈是先进后出的队列,一一对应,永远不会有一个内存块从栈中弹出。

     堆:是有allo分配的内存,速度比较慢,而且容易产生内存碎片,不过用起来最方便。

     分配方式:

     堆:都是动态分配

     栈:有两种分配方式,动态分配和静态分配。静态分配是由编译器完成的,比如局部变量的分配。动态分配是由alloc函数进行分配的。但是栈的动态分配也是由编译器释放,不用我们收手动实现。

     分配效率:

     栈:是机器系统提供的数据结构,计算机会在底层堆栈进行支持,分配专门的寄存器存放栈的地址,进栈出栈都有专门的指令执行,这就决定了栈的效率比较高。

     堆:是C/C++函数库提供的,机制很复杂

  • 相关阅读:
    去掉Form产生的空行
    转:Override错误
    面试
    JMF获取设备列表失败,获取视频设备失败?
    jquery 插件ztree的应用动态加载树节点数据
    关于Struts2上传文件
    未能解析引用的程序集“”,因为它对不在当前目标框架“”具有依赖关系。请删除对不在目标框架中的程序集的引用,或考虑重新确定项目的目标。 Kevin
    The diffrence between Cast() and OfType() Kevin
    “System.Collections.Generic.IEnumerable<decimal>”不包含“ToArray”的定义,并且找不到可接受类型为“System.Collections.Generic.IEnumerable<decimal>”的第一个参数的扩展方法“ToArray” Kevin
    partial关键字的含义和使用 Kevin
  • 原文地址:https://www.cnblogs.com/lmg4819/p/8243360.html
Copyright © 2011-2022 走看看