ios 内存五大区
2021-03-14 本文已影响0人
星空WU
1、堆(heap)区
是有程序员分配和释放,用于存放运行中被动态分配的内存段。大小不定,可增加和缩减。
1)不连续的内存区域
2)向高地址扩展的数据结构
3)遵循先进先出(FIFO)原则
OC 程序中使用 alloc、new 创建的对象、C 语言中使用 malloc、 calloc、realloc 分配的空间是在堆上,需要手动释放或者由垃圾回收机制来回收。
优点
灵活方便,随取随用
缺点:
需要手动管理,效率低,容易产生内存碎片。
访问堆中的内存时,一般需要先通过对象读取到栈区的指针地址,然后通过指针地址访问堆区。
栈(stack)区
栈是由编译器分配和释放,用于存放程序临时创建的变量、函数的参数、局部变量等。
特点
1)是一块连续的内存区域
2)遵循先进后出的原则
3)向低地址的数据结构
优点
栈是由编译器分配和释放,不会产生内存碎片,快速高效
缺点
内存大小有限制(iOS 主线程、其他线程以及 Mac)相关说明在 Stack space 查阅
由于函数运行而临时占用的内存区域
全局(静态)区
全局区是编译时分配的内存空间,在程序运行过程中,此内存中的数据一直存在,程序结束后由系统释放。static 修饰的变量始终保存到常量区。
数据区:用来存放可执行文件中已经初始化的全局变量,也就是用来存放静态分配的变量和全局变量(.data)
BSS区:包含了程序中未初始化的全局变量。
常量区
是编译时分配的内存空间,在程序结束后由系统释放。存放的是常量,是一块特殊的区域。
代码区
用来存放函数的二进制代码,它是可执行程序在内存中的镜像。代码段需要防止在运行时被非法修改,只允许读操作,不允许写操作