总结堆与栈的区别

浏览了网上很多关于堆栈的区别,在此记录一下,以便学习。

1、管理方式不同

对于栈,由编译器自动管理,无须我们手工控制,对于堆,分配释放工作由程序员控制,容易产生内存泄漏。

2、空间大小不同

栈的空间比较小,堆的比较大

3、碎片问题

对于堆,频繁的new/delete会造成内存空间的不连续,从而产生内存碎片,使程序效率降低。

对于栈,先进后出,栈顶出栈,不会出现栈中间弹出内容,所以不会出现内存的不连续,不会出现碎片问题。

4、生长方向不同

对于堆来讲,生长方向是向上的,也就是向着内存地址增加的方向;

对于栈来讲,它的生长方向是向下的,是向着内存地址减小的方向增长。 

5、分配方式不同

对于堆,是动态分配的,没有静态分配。

对于栈,有2种分配方式,动态分配与静态分配。静态分配是编译器完成的。动态分配由函数进行分配,但是栈的动态分配和堆是不同的,栈的动态分配是由编译器进行释放,无需我们手工控制。

6、分配效率不同

栈是机器系统系统的数据结构,计算机会在底层对栈提供支持,压栈出栈都有专门的指令执行,所以栈的效率比较高。

堆是c/c++库函数提供的,堆的机制很复杂,例如为了分配一块内存,库函数需要按照一定的算法在堆中搜索可用的足够大小的内存空间,如果没有足够的内存,有可能调用系统功能增加程序数据的内存空间,然后返回。显然,堆的分配效率很低。

 

虽然,栈有很多好处,但是和堆相比,不是很灵活,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性,有时候分配大量内存空间,还是用堆比较好。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值