拓胜科技—官网

咨询热线:
400-689-2779

拓胜科技学校新闻>关于iOS开发常见的内存分配与分区问题

  内存分配与分区是iOS开发中常接触到的问题,解决内存的分配关系到运行的速度问题,关于iOS开发常见的内存分配与分区问题,对于iOS开发的学习有一定的帮助。

  关于RAM&ROM

  RAM与ROM就是具体的存储空间,统称为存储器。

  RAM(random access memory):运行内存,CPU可以直接访问,读写速度非常快,但是不能掉电存储。它又分为:

  动态DRAM,速度慢一点,需要定期的刷新(充电),我们常说的内存条就是指它,价格会稍低一点,手机中的运行内存也是指它。

  静态SRAM,速度快,我们常说的一级缓存,二级缓存就是指它,当然价格高一点。

  ROM(read only memory):存储性内存,可以掉电存储,例如SD卡、Flash(机械磁盘也可以简单的理解为ROM)。用的多的:NandFlash,还有NorFlash,现在用的已经比较少了(两者主要区别是前者空间大,便宜,后者可以直接运行程序,读取速度快)。

  由于RAM类型不具备掉电存储能力(即一停止供电数据全没了,从新上电后全是乱码,所以需要初始化),所以app程序一般存放于ROM中。RAM的访问速度要远高于ROM,价格也要高。

  RAM与ROM协同工作

  由于RAM不能掉电存储,所以我们的APP程序,刷机包,下载的文件等等,都是在ROM里面存储的。

  手机里面使用的ROM基本都是NandFlash,CPU是不能直接访问的,而是需要文件系统/驱动程序(嵌入式中的EMC)将其读到RAM里面,CPU才可以访问。另外,RAM的速度也比NandFlash快。

  内存分区:可以分为5个区

  说到内存分区,内存即指的是RAM。

  栈区(stack): 这个一般由编译器操作,或者说是系统管理,会存一些局部变量,函数跳转跳转时现场保护(寄存器值保存于恢复),这些系统都会帮我们自动实现,无需我们干预。 所以大量的局部变量,深递归,函数循环调用都可能耗尽栈内存而造成程序崩溃。

  堆区(heap): 一般由程序员管理,比如alloc申请内存,free释放内存。我们创建的对象也都放在这里。

  全局区(静态区 static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后有系统释放。注意:在嵌入式系统中全局区又可分为未初始化全局区:.bss段和初始化全局区:data段。举例:int a;未初始化的。int a = 10;已初始化的。

  常量区:常量字符串就是放在这里的,还有const常量。

  代码区:存放代码,app程序会拷贝到这里,程序不是在ROM里面存储吗?看下面的举例:

  图中各个区并不连续

培训世界 拓胜科技体验课 免费预约