zoukankan      html  css  js  c++  java
  • iOS内存的基础探究(静态存储区、栈、堆)

    代码区存放于低地址,栈区存放于高地址。区与区之间并不是连续的。
    app启动后,代码区,文字常量区,全局存储区大小固定,指向这些区的指针不会产生崩溃性的错误。而堆区和栈区是时时刻刻变化的(堆的创建销毁,栈的弹入弹出),当使用一个指针指向这两个区的内存时,要注意内存是否已释放,指向已经释放的内存会产生野指针。

    存储区

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

    亦称动态内存分配。程序在运行的时候用malloc或new申请任意大小的内存,程序员自己负责在适当的时候用free或delete释放内存。动态内存的生存期可以由我们决定,如果我们不释放内存,程序将在最后才释放掉动态内存(如果某动态内存不再使用,需要将其释放掉,否则认为发生了内存泄漏现象)。

    静态存储区(全局存储区)

    内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。它主要存放静态数据、全局数据和常量。程序结束后由系统释放。

    全局变量、静态变量会存储在此区域。事实上全局变量也是静态的,因此,也叫全局静态存储区。

    存储方式:

    • 初始化的全局变量跟静态变量放在一片区域(数据区)
    • 未初始化的全局变量与静态变量放在相邻的另一片区域(BSS区)

    举例:

    int a;未初始化的。int a = 10;已初始化的。

    例子代码:

    int a = 10; 全局初始化区

    char *p; 全局未初始化区

     main{
       int b; 栈区
       char s[] = "abc" 栈
       char *p1; 栈 
       char *p2 = "123456";  123456\\0在常量区,p2在栈上。
       static int c =0; 全局(静态)初始化区 
    
       w1 = (char *)malloc(10); 
       w2 = (char *)malloc(20); 
       分配得来得10和20字节的区域就在堆区。 
     }
    

    文字常量区

    在程序中使用的常量存储在此区域(常量字符串就是放在这里的)。程序结束后,由系统释放。在程序中使用的常量,都会到文字常量区获取。

    代码区

    存放函数体的二进制代码,运行程序就是执行代码,代码要执行就要加载进内存。在程序结束后由系统释放。

    栈与堆的比较:

    1. 申请后的系统是如何响应

    • 栈:存储每一个函数在执行的时候都会向操作系统索要资源,栈区就是函数运行时的内存,栈区中的变量由编译器负责分配和释放,内存随着函数的运行分配,随着函数的结束而释放,由系统自动完成。注意:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。
    • 堆:首先应该知道操作系统有一个记录空闲内存地址的链表。当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。

    2. 申请大小的限制

    • 栈:栈是向低地址扩展的数据结构,是一块连续的内存的区域。是栈顶的地址和栈的最大容量是系统预先规定好的,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数 ) ,如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。
    • 堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。

    3. 申请效率的比较

    • 栈:由系统自动分配,速度较快,不会产生内存碎片
    • 堆:是由alloc分配的内存,速度比较慢,而且容易产生内存碎片,不过用起来最方便

    转自:

    路漫漫其修远兮,吾将上下而求索!!!
  • 相关阅读:
    hdu 1199 Color the Ball 离散线段树
    poj 2623 Sequence Median 堆的灵活运用
    hdu 2251 Dungeon Master bfs
    HDU 1166 敌兵布阵 线段树
    UVALive 4426 Blast the Enemy! 计算几何求重心
    UVALive 4425 Another Brick in the Wall 暴力
    UVALive 4423 String LD 暴力
    UVALive 4872 Underground Cables 最小生成树
    UVALive 4870 Roller Coaster 01背包
    UVALive 4869 Profits DP
  • 原文地址:https://www.cnblogs.com/LGLblog/p/13275177.html
Copyright © 2011-2022 走看看