附加作业——堆和栈

数据结构

  栈和堆都是特殊的数据结构,都有其特殊的性质,比如说栈是”FILO“,而堆是一个两头开口的大麻袋,比较随意,别太大就能放进去,从哪头放没关系,想要拿出来看看得现翻(于是有点儿慢)。

  日常编程中,我们比较常用的是栈,估计不会有人愿意自己手工实现一个堆的,至于用栈的话熟悉基本性质,和基本的算法结合好就ok了,不会有什么障碍

系统相关

  一般我们口头上说的堆基本上指的都是内存中的堆空间,程序在内存中的空间一般可以分成5类,本文要讨论的是”堆“和”栈“,其实内存中的堆栈和我们一般的堆栈数据结构在性质上是没有区别的,只不过内存中的堆栈隶属于操作系统,操作系统将内存硬件进行封装然后呈现出我们所见的堆栈,当然,操作系统还封装了一系列堆栈的操作。而程序设计语言又对这些操作中的一部分进行了封装。

  详细介绍一下我眼中的堆,堆是一个很随意的东西,用户不用关心堆中地址随使用过程的生长情况,用户也不用关心,现在对空间的占用情况。随意有随意的好处,它随意,用户也可以很随意,随时随地lloc,随时随地new,几乎予取予求,不怎么受到限制。当然,随意也有随意的坏处,太随意了就导致了散漫、低效。这也没办法,本身这就是一组矛盾,鱼和熊掌不可兼得,知道什么时候能用什么、该用什么基本就ok了。

  再来说一说堆,堆是很严谨的。对于栈,要么正向生长、要么逆向生长。操作系统对于栈的”纪律“也是比较严格的,几乎不允许用户随意改变栈内的空间,什么样的程序就对应什么样的栈,差一点儿也不行。这样弄得系统中的栈看起来并不那么实用,因为操作系统看的太严。而操作系统的严格管理也造就了栈更高的效率。至于堆栈真正物理意义的分配和释放速度,有的人说:”同一块内存,速度理应是一样的,堆比栈快是因为堆内存的分配释放多了一些栈所不必要的操作“”有的人说栈更快,占有一些堆没有也不可能有的硬件支持“,两者都有道理。但是栈也有缺点,常被人吐槽的是”溢出“,因为究竟弄多大的空间作为栈这个不能按照少数人的极端需求来,比如说在邹老师眼里,栈可能要很大,至少要装下10e6?然而,一个更合理的大小才能保证整个系统的效率

  附加说一点,系统中的栈还分好几种,什么运行栈啊,调用栈啊,各司其职。

posted on 2013-12-30 21:18  hennande  阅读(184)  评论(0编辑  收藏  举报

导航