iOS栈区 堆区等概念以及区别

1,684 阅读1分钟

栈区 (stack)

栈一般来说都是一个先进后出的队列,后进入的数据,会被先释放掉.栈区存放函数内的局部变量,形参和函数返回值.栈区的内存由系统自动管理释放,内存的分配是连续的,且分配的内存地址是向下增长.申明的变量过了作用域范围后内存便会自动释放,不需要开发人员手动管理.

栈区分配的内存地址向下增长

堆区 (heap)

堆一般是个链表或者树结构,不同语言有不同实现,相对而言复杂的多.堆区一般由开发人员手动管理(malloc()函数申请),如果开发人员没有手动释放(free()),容易造成内存泄漏,只有程序结束时由系统统一回收.堆区在内存中的分布是不连续的,是由不同区域的内存块通过指针链接.

总结

从上面可以看出,栈区内存由系统自动分配,速度较快,但是无法由开发人员控制.相比较而言,堆区有着更好的动态分配性能,但是一般存放在堆区的往往数据结构更加复杂,会导致操作的成本远远大于栈区,效率比栈区低

代码区

存放函数的二进制代码,代码区的内存是由系统控制

静态区(static)

静态区存放全局变量和静态变量,内存在程序结束后由系统统一释放

常量区

常量区存放常量字符串,也是在程序结束后由系统释放内存