对堆和栈的一点思考

这里所谈论的堆和栈并不是指数据结构角度的堆和栈,而是,站在程序、系统的角度的堆和栈。

首先,讲讲栈吧,栈又叫堆栈,具体为什么这么叫,我不清楚,但是,至少有点意思的地方是这个名字刚好是这两个东西单名的结合。

栈的话,通常都是程序用于保存临时数据的地方,比如一些函数内部申明的变量,函数调用时用来保存临时的函数状态(也叫过程活动记录,就是些当前的状态参数、栈顶指针等等信息保存下来用于函数返回后的现场复原),还有就是较长的表达式一些中间结果也是保存在栈中的。那么栈的本源是什么呢?这个可以从栈空间的分配说起,栈空间的分配是在程序加载到内存的时候就分配好的,也就是说,在程序从硬盘读取出来,加载到内存的时候,栈空间就已经确定好了,一个程序加载到内存后的空间分配大体是栈空间、bss段、数据段、文本段(地址从高到低),除去一些“空的空间”,大体就是这么分配的。这里我们可以得到一个信息就是栈空间是程序加载的时候,系统自动为其分配的用于给程序分配临时存放数据的地方。栈空间一般都是从高地址往低地址生长的,在windows中栈空间是有限的,在生成可执行文件的时候就会确定下来,而linux系统中栈空间是可以生长的。另外,就如大多数的结论一样,栈的使用一般都是临时性的,函数里的临时变量所用的空间在该函数返回时自动的被回收。

堆的话一般都是需要向系统申请过才能使用,比如c的malloc函数,也就是说堆本身并不是来自程序自身的空间,而是程序向系统申请的一块内存空间,因此,在堆使用完后,需要手动的释放(对应c的free)这一块内存空间,否则的话,其他程序是用不了这一块内存空间的。另外,堆的空间并不像栈空间的限制那么大,理论上只要内存还有空闲的区域,就能继续申请堆空间。在使用指针的时候,一定要清楚这个指针指向的空间是个什么类型的空间(更根本的指针有没有指向一块能用的空间),这样就可以减少很多在使用指针时发生的问题。另外,区别一下堆和数据区,个人认为数据区不属于堆的概念,数据区就是程序的全局变量或是静态变量初始化后所存放的区域,这和堆空间存放数据有些相似,两者都会在程序运行期间一直存在。然而,最大的不同就是一个是程序加载时自动分配的,堆是需要向系统申请使用的空间。

对于堆和栈的讨论就到这里,基本上写程序的话,只要了解堆是需要手动申请手动释放的即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值