C++中,内存分为以下5个区:
-
Stack(栈):
由编译器在需要时自动分配,不需要时自动清除的变量存储区。通常存放局部变量、函数参数值、返回变量等。 -
Heap(堆):
容量大于栈,程序中动态分配的内存,由程序员申请和释放。如果程序员没有释放掉,资源将由操作系统在程序结束后自动回收。 -
BSS(Block started by symbol):
存放未初始化的全局和静态变量。(默认设为0) -
Data Segment (数据区):
存放已初始化的全局和静态变量, 常量数据(如字符串常量)。 -
Code Segment(代码区):
也称Text Segment,存放可执行程序的机器码。
堆和栈的区别
1、申请和管理方式
栈:系统自动分配;由编译器进行管理,在需要的时候分配空间,在不需要的时候自动回收空间;一般用于存放函数参数和局部变量;
堆:程序员自己申请释放;如果不回收释放,则会存在内存泄漏的问题;
2、内存生长方向
栈:栈是向低地址扩展的数据结构(向下),是一块连续的内存的区域;
堆:堆是向高地址扩展的数据结构(向上),是不连续的内存区域(不连续是由于系统是用链表来存储的空闲内存地址的);
3、申请大小
栈:在Windows下,栈的大小是一个编译时就确定的常数,空间比较小,一般是2M;如果申请的空间超过栈的剩余空间时,将提示overflow;
堆:堆的大小受限于计算机系统中有效的虚拟内存;堆获得的空间比较灵活,也比较大;
4、申请效率
栈:栈由系统自动分配,速度较快。
堆:堆是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,但用起来最方便;
5、碎片问题
栈:栈是一个先进后出的队列,进出一一对应,不会产生碎片;
堆:频繁的new/delete会造成大量碎片,使程序效率降低;