C++内存分配那点事儿
虚拟内存分段
一个程序要运行起来,必然要将数据载入内存。程序不同组成部分会存放到程序虚拟内存的不同区域。如下图所示。
其中,栈主要用于函数调用开辟栈帧,栈是向下生长的,即栈帧空间的开辟是先从高地址开始,然后往低地址。
堆则相反,向上生长。主要用于动态内存开辟。
数据段,也叫做静态区,主要存放static变量和全局变量。
代码段,也叫做常量区,主要存放程序编译出的指令。
堆栈对比
栈 | 堆 | |
---|---|---|
内存管理 | 编译器自动管理 | 由程序员控制 |
生长方向 | 向下生长,往内存地址减小方向 | 向上生长,往内存地址增加方向生长 |
空间大小 | 较小 | 32位系统约2G |
存在问题 | 由编译器自动管理,没有堆的问题 | 频繁申请和释放空间导致内存空间不连续,从而造成大量碎片,使程序效率降低 |
静态分配 | 可以 | 不可以 |
动态分配 | 可以通过_alloca进行动态分配,不能通过free或delete释放 | 只能动态分配,new/delete& |