栈区 (stack)
栈一般来说都是一个先进后出的队列,后进入的数据,会被先释放掉.栈区存放函数内的局部变量,形参和函数返回值.栈区的内存由系统自动管理释放,内存的分配是连续的,且分配的内存地址是向下增长.申明的变量过了作用域范围后内存便会自动释放,不需要开发人员手动管理.
堆区 (heap)
堆一般是个链表或者树结构,不同语言有不同实现,相对而言复杂的多.堆区一般由开发人员手动管理(malloc()函数申请
),如果开发人员没有手动释放(free()
),容易造成内存泄漏,只有程序结束时由系统统一回收.堆区在内存中的分布是不连续的,是由不同区域的内存块通过指针链接.
总结
从上面可以看出,栈区内存由系统自动分配,速度较快,但是无法由开发人员控制.相比较而言,堆区有着更好的动态分配性能,但是一般存放在堆区的往往数据结构更加复杂,会导致操作的成本远远大于栈区,效率比栈区低
代码区
存放函数的二进制代码,代码区的内存是由系统控制
静态区(static)
静态区存放全局变量和静态变量,内存在程序结束后由系统统一释放
常量区
常量区存放常量字符串,也是在程序结束后由系统释放内存