堆和栈的全面总结

来源:互联网 发布:cf手游刷枪软件ios 编辑:程序博客网 时间:2024/05/21 14:53

操作系统中的栈:

        由编译器自动分配和自动释放,一个函数对应一个栈,用于存放函数的参数值、函数调用完成后的返回值和函数体内的局部变量等。栈占用连续的一段内存空间,其操作和组织方式与数据结构中的栈十分相似。栈是为了执行线程留出的内存空间。当调用函数时创建栈,当函数执行完毕,栈就被回收了。

操作系统中的堆:

         由程序员手动进行内存的申请与释放。由于程序员手动申请及释放的内存块存放在堆中,堆中有很多内存块,所以堆的组织方式类似于链表。操作系统中的堆与数据结构中的堆完全不同。我觉得通俗的理解可以是这样的:数据结构中的堆是"结构堆",有严谨的逻辑和操作方式,而操作系统中的堆,更像是使用链表将"一堆杂乱的东西"联系起来。堆是为动态分配预留的内存空间,其生命周期为整个应用程序的生命周期。当应用程序结束以后,堆开始被回收。

        每个线程都有一个属于自己的栈,但每一个应用程序通常只有一个堆(一个应用程序使用了多个堆的情况也是有的)。当线程被创建的时候,设置了栈的大小。在应用程序启动的时候,设置了堆的大小。栈的大小通常是固定的,但是堆可以在需要的时候进行扩展,如程序员向操作系统申请更多内存的时候。

由于栈的工作方式类似于数据结构中的栈,堆的工作方式类似于链表,所以栈显然会比堆快得多。按照栈的存取方式,想要释放内存或是新增内存,只需要相应移动栈顶指针即可。堆则要首先在内存的空闲区域寻找合适的内存空间,然后占用,然后指向这块空间。显然堆比栈要复杂得多。

       接下来本来是想将栈和堆分开进行陈述,斟酌了一下还是决定从同一方面对栈和堆进行比较。有了比较才明显。

1. 在创建栈的时候栈的大小就固定了,因为栈要连续占用一段空间。根据上文所属的堆的特性,决定了堆的大小是动态的,其分配和释放也是动态的。

2. 栈中的数据过多会导致爆栈,比如dfs写搓了。而假如堆也爆了的话。。。那说明内存也爆了。

3. 每个函数的栈都是各自独立的,但是一个应用程序的堆是被所有的栈共享。既然提到共享,那么这里就有"并行存取"的问题了。实际上并行存取是由堆控制的,而不是被栈控制的。

0 0
原创粉丝点击