内存五大内存区
一,堆区(heap)
-
是由程序员分配和释放,用于存放运行中被动态分配的内存段。大小不定,可增加和缩减
-
堆向高地址扩展的数据结构,是不连续的内存区域。程序员负责在何时释放内存(如用free或delete),在iOS的ARC程序中,系统自动管理计数器,计数器为0的时候,在当次的runloop结束后,释放掉内存。堆中的所有东西都是匿名的,这样不能按名字访问,而只能通过指针访问。
对于堆来讲,频繁的new/dealloc势必会造成内存空间的不连续性,从而造成大量的碎片 ,使程序效率降低。
二,栈区(heap)
-
栈是由编译器分配和释放,用于存放程序临时创建的变量、函数的参数、局部变量等
-
是一块连续的内存区域,遵循先进后出的原则,向低地址的数据结构
-
在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值 也会被存放回栈中。
-
由于栈的后进先出特点,所以 栈特别方便用来保存/恢复调用现场。从这个意义上讲,我们可以把堆栈看成一个寄存、交换临时数据的内存区。
三,全局区(静态)( bss segment )
-
全局区是编译时分配的内存空间,在程序运行过程中,此内存中的数据一直存在,程序结束后由系统释放。static修饰的变量始终保存到常量区
-
用来存放可执行文件中已经初始化的全局变量,也就是用来存放静态分配的变量和全局变量(.data)
-
而bss段通常是指用来存放程序中未初始化的全局变量和静态变量的一块内存区域。
-
BSS段在程序执行之前会清0,所以未初始化的全局变量(静态变量)已经是0了。所以这种情况还是存放在BSS段,一旦初始化就会从BSS段中回收掉,转存到data段(数据段)中。
四,常量区(data segment)
-
是编译时分配的内存空间,在程序结束后由系统释放。存放的是常量,是一块特殊的区域
-
通常是指用来存放程序中已经初始化的全局变量和静态变量的一块内存区域。数据段属于静态内存分配,可以分为只读数据段和读写数据段。字符串常量等,是放在只读数据段中,结束程序时才会被收回。
五,代码区(code segment/text segment)
- 用来存放函数的二进制代码,它是可执行程序在内存中的镜像。代码段需要防止在运行时被非法修改,只允许读操作,不允许写操作