内存分配
1、栈(stack)
内存由系统自动分配,自动释放,分配的位置和大小无法主动控制
2、堆(heap)
主动申请和释放,new、malloc等函数分配内存
3、堆和栈的主要区别
① 申请方式
int a; //系统自动分配内存
int *p = new int a[4]; //主动申请内存,调用delete[]释放内存
② 效率
栈:
windows下系统预留栈的空间一般为2M,只要申请的内存大小小于剩余的可用栈 大小,系统立马分配,否则报错,GetlastError();
堆:
操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲节点链表中删除,并将该结点的空间分配给程序。首地址记录本地分配的大小,由于找到的堆节点的大小不一定正好等于申请的大小,系统会自动将多余的那部分重新放入空闲链表中。
③ 申请大小
栈:
在windows下,栈是一种想低地址扩展的数据结构,分栈的大小已经是系统多分配好的;
堆:
堆是一种向高地址拓展的数据结构,由一块块链表内存组成,其大小限制很大程度上取决于虚拟内存
④ 存取效率
栈由操作系统自动分配,会在硬件层级对栈提供支持;分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高;堆则有C/C++提供的库函数或者运算符来完成申请和管理,实现机制较为复杂,频繁的内存申请容易产生内存碎片。