iOS底层-23:内存五大区域

iOS开发中经常会涉及到内存,内存主要分为五个区:栈区、堆区、全局区、常量区、代码区

内存五大区

栈区(stack)

栈是由编译器来进行分配和释放的,用于存储临时变量、函数的参数、局部变量等。

特点
  • 一块连续的内存区域,遵循先进后出(FILO)原则
  • 栈是系统数据结构,其对应进程或线程唯一
  • 栈是向低地址扩展的数据结构
  • 栈是在运行时分配
  • iOS中,栈地址一般以0x70开头
优缺点

优点:栈是由编译器进行分配和释放的,不会产生内存碎片,快速高效
缺点:栈的内存大小有限制,在Stack space中可查阅。


iOS中:主线程 1MB 子线程512KB
OS X 中:主线程 8MB

堆区(heap)

堆区是由程序员分配和释放的,用于存放运行中被动态分配的内存段。

特点
  • 不连续的内存区域,类似于链表(方便增删,不变查找),遵循先进先出(FIFO)原则
  • 向高地址扩展的数据结构
  • 运行时分配
  • iOS中,堆地址一般以0x60开头
  • OC程序中使用alloc、new 创建的对象、C语言中使用malloc、 calloc、realloc分配的空间是在堆上,需要手动释放或者由垃圾回收机制来回收
优缺点

优点:灵活方便,随取随用。
缺点:需要手动释放,效率低,容易产生内存碎片。free()

  • 访问堆中内存时,一般是先读取到栈区内存,再通过指针地址访问堆区。

静态区(全局区)

全局区是编译时分配的空间,在程序运行的过程中一直存在,程序结束后由系统释放。在iOS以0x1开头。主要存放

  • 未初始化的全局变量静态变量,即BBS
  • 初始化的全局变量静态变量,即数据区(.data

全局变量的值在运行时可以被动态修改,静态变量是static修饰的变量,包含局部静态变量全局静态变量

常量区(.rodata)

是编译时分配的内存空间,在程序结束后由系统释放。存放的是常量,是一块特殊的区域

代码区(.text)

用来存放函数的二进制代码,它是可执行程序在内存中的镜像。代码段需要防止在运行时被非法修改,只允许读操作,不允许写操作

代码验证


打印结果:


压栈、栈帧、内存溢出

你可能感兴趣的:(iOS底层-23:内存五大区域)