内存分配--堆和栈

内存分配

1、栈(stack)

内存由系统自动分配,自动释放,分配的位置和大小无法主动控制

2、堆(heap)

主动申请和释放,new、malloc等函数分配内存

3、堆和栈的主要区别
① 申请方式
int a; //系统自动分配内存
int *p = new int a[4];  //主动申请内存,调用delete[]释放内存
② 效率

栈:
windows下系统预留栈的空间一般为2M,只要申请的内存大小小于剩余的可用栈 大小,系统立马分配,否则报错,GetlastError();

堆:
操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲节点链表中删除,并将该结点的空间分配给程序。首地址记录本地分配的大小,由于找到的堆节点的大小不一定正好等于申请的大小,系统会自动将多余的那部分重新放入空闲链表中。

③ 申请大小

栈:
在windows下,栈是一种想低地址扩展的数据结构,分栈的大小已经是系统多分配好的;
堆:
堆是一种向高地址拓展的数据结构,由一块块链表内存组成,其大小限制很大程度上取决于虚拟内存

④ 存取效率

栈由操作系统自动分配,会在硬件层级对栈提供支持;分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高;堆则有C/C++提供的库函数或者运算符来完成申请和管理,实现机制较为复杂,频繁的内存申请容易产生内存碎片。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值