12 C/C++之堆与栈

  • 管理方式不同

对于栈来讲,它是由编译器自动管理的,无须手工控制;对于堆来说,它的释放工作由程序员控制,容易产生memory leak。

  • 空间大小不同

一般来讲在32位系统下,堆内存可以达到4GB的空间,从这个角度来看堆内存几乎是没有什么限制的。但是对于栈来讲,一般都是有一定空间大小的。

  • 碎片问题

对于堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而产生大量的碎片,使程序效率降低。对于栈来讲,则不存在这个问题,其原因还是从栈的特殊数据结构说起。栈是一个具有严明纪律的队列,其中的数据必须遵循先进后出的规则,相互之间紧密排列,绝不会留给其他数据可插入的空隙,所以都不可能有一个内存块从栈中间弹出,必须严格按照一定的顺序一一弹出。

  • 生长方向

对于堆来讲,其生长方向是向上的,也就是向着内存地址增加的方向增长;对于栈来讲,它的生长方向是向下的,是向着内存地址减小的方向增长的。

  • 分配方式

堆都是动态分配的,没有静态分配的堆。栈有两种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由alloca函数完成,但是栈的动态分配和堆是不同的,它的动态分配是由编译器进行释放的,无须手工释放。

  • 分配效率

栈是机器系统提供的数据结构,计算机会在底层对栈提供支持,它会分配专门的寄存器存放栈的地址,而且压栈出栈都会有专门的指令来执行,这就决定了栈的效率比较高,堆则是C/C++函数库提供的,它的机制很复杂,例如为了分配一块内存,库函数会按照一定的算法在堆内存中搜索可用的足够大小的空间,如果没有足够大小的空间(可能是由于内存碎片太多),则可能调用系统功能去增加程序数据段的内存空间,这样就有机会分到足够大小的内存了,然后返回。显然,堆的效率比栈要低很多。

-------C/C++知识持续发布中,如果能学到一点点知识,请收藏关注,共同学习进步--------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值