iOS——内存分区

内存分区

之前写程序时只知道数据是保存在不同内存区域的,但没系统了解过,浅学一下。iOS内存分区主要分为五大块。下面一一讲解一下。

栈区(stack)

栈区是由编译器自动分配并释放的,是向低地址扩展的数据结构,是一块连续的存储区域,栈顶的地址和栈的最大容量是一开始系统就规定好的,栈是系统的数据结构,对应线程/进程唯一。栈主要存放了
函数的参数值:在函数被调用时,其参数会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。
局部变量。

栈空间分为静态分配和动态分配两种:
静态分配是编译器完成的,比如自动变量(auto)的分配。
动态分配由alloca函数完成。
栈的动态分配无需释放(是自动的),也就没有释放函数。

栈的优点是快速高效,缺点是有限制,数据不灵活。

堆区 (heap)

堆区由程序员分配和释放,如果程序员不释放,程序结束时,系统可能会回收,虽然程序结束时所有的数据空间都会被释放回系统,但是精确的申请内存,释放内存匹配是良好程序的基本要素。
堆空间的分配总是动态的,类似于链表,是向高地址拓展的数据结构,是不连续的区域,当进程调用 new、alloc、malloc、realloc等函数分配内存时,分配的内存块添加在堆里。
不同堆分配的内存无法互相操作。

全局区(静态区)( bss segment )

全局变量和静态变量的存储是放在一起的,初始化的全局变量和静态变量存放在一块区域,未初始化的全局变量和静态变量在相邻的另一块区域


注意:全局区又可分为未初始化全局区:
     .bss段和初始化全局区:data段。
     举例:int a;未初始化的。int a = 10;已初始化的。
     int a = 10;  全局初始化区
 	 char *p;  全局未初始化区
 	 int main(void) {
 	 	//
 	 }

由 static 修饰的变量会成为静态变量,该变量的内存由全局/静态区在编译阶段完成分配,且仅分配一次。
static 可以修饰局部变量也可以修饰全局变量。
全局/静态区 的内存在编译阶段完成分配,程序运行时会一直存在内存中,只有当程序结束后才会由操作系统释放。

文字常量区

存放常量字符串,是编译时分配的内存空间,程序结束后由系统释放

程序代码区

代码区是用来存放可执行文件的操作指令(存放函数的二进制代码),其实就是存放程序的所有代码代码区需要防止在运行时被非法修改,所以只准许读取操作,而不允许写入(修改)操作:它是不可写的。

栈区和堆区申请的系统响应

栈区:存储每一个函数在执行的时候都会向操作系统索要资源,栈区就是函数运行时的内存,栈区中的变量由编译器负责分配和释放,内存随着函数的运行分配,随着函数的结束而释放,由系统自动完成。

堆区:
1.首先应该知道操作系统有一个记录空闲内存地址的链表。
2.当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。
3 .由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值