C++内存分区模型随笔
代码段:存放函数的二进制代码,由操作系统进行管理
数据段:存放全局变量和静态变量以及常量
堆:由程序员分配和释放,若不释放,程序结束时由操作系统回收(向上增长)
栈:由编译器自动分配释放,存放函数的参数值、局部变量等(向下增长)
代码段向下地址由低到高
堆和栈的主要区别:
- 管理方式不同:栈是系统自动管理的,在出作用域时,将自动被释放;堆需要手动释放,若程序中不释放,程序结束时由操作系统回收。
- 空间大小不同:堆内存的大小受限于物理内存空间;而栈就小的可怜,一般只有8M(可以修改系统参数)。
- 分配方式不同:堆是动态分布;栈有静态分布和动态分布(都是自动释放)。
- 分配效率不同:栈是系统提供的数据结构,计算机在底层提供了对栈的支持,进栈和出栈有专门的指令,效率比较高;堆是由C++函数库提供的。
- 是否产生碎片:对于栈来说,进栈和出栈都有着严格的顺序(先进后出),不会产生碎片;而对频繁的分配和释放,会造成内存空间的不连续,容易产生碎片,太多的碎片会导致性能的下降。