技术编程|计算机世界里的“堆栈”你真的懂吗?( 二 )


技术编程|计算机世界里的“堆栈”你真的懂吗?
文章图片

文章图片

最后一个托盘是9号 。因此 , “第一个出来”的盘子也是9号 。当顾客从托盘堆的顶部取出托盘时 , 第一个托盘是9号 , 第二个托盘是2号 。然后更多的托盘被添加 。这些托盘将不得不在我们装载第一个托盘之前从堆栈上下来 。在托盘堆的任意顺序的push和pop出之后 , 托盘42仍然在底部 。只有在42号托盘从堆栈顶部弹出后 , 堆栈才会再次清空 。
而堆栈通常被放置在机器的最上面的地址区域 。它们通常从最高的内存位置增长到较低的内存位置 , 允许在程序内存末端和堆栈“顶部”之间的内存使用中获得最大的灵活性 。在我们的讨论中 , 堆栈在内存中是“向上”增长还是“向下”增长基本上是不相关的 。堆栈的“top”元素是最后被推入并将首先被弹出的元素 。堆栈的“底部”元素在删除时将使堆栈为空 。
二者区别
堆是在程序运行时 , 而不是在程序编译时 , 申请某个大小的内存空间 。即动态分配内存 , 对其访问和对一般内存的访问没有区别 。它由程序员分配和回收 。
栈就是一个桶 , 后放进去的先拿出来 , 它下面本来有的东西要等它出来之后才能出来 。(后进先出)由系统自动分配和回收 。
堆栈缓存方式
栈使用的是一级缓存 ,他们通常都是被调用时处于存储空间中 , 调用完毕立即释放 。
堆则是存放在二级缓存中 , 生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收) 。所以调用这些对象的速度要相对来得低一些 。栈的优势是 , 存取速度比堆要快 , 仅次于直接位于CPU中的寄存器 。
栈:在Windows下,栈是向低地址扩展的数据结构 , 是一块连续的内存的区域 。意思是栈顶的地址和栈的最大容量是系统预先规定好的 , 在 WINDOWS下 , 栈的大小是2M(也有的说是1M , 总之是一个编译时就确定的常数) , 如果申请的空间超过栈的剩余空间时 , 将提示overflow 。因此 , 能从栈获得的空间较小 。
堆:堆是向高地址扩展的数据结构 , 是不连续的内存区域 。这是由于系统是用链表来存储的空闲内存地址的 , 自然是不连续的 , 而链表的遍历方向是由低地址向高地址 。堆的大小受限于计算机系统中有效的虚拟内存 。由此可见 , 堆获得的空间比较灵活 , 也比较大 。
【技术编程|计算机世界里的“堆栈”你真的懂吗?】作为“堆”的数据空间 , 必须是灵活的 , 因为成千上万的程序员在写什么程序是未知的 。但可知道的一点 , 就是他们是跑在确定的某个OS里面的 。因此 , 也不过就是给系统管理的数据空间起了个名字 , 叫栈;给程序员使用的空间 , 起了个名 , 叫堆 。


推荐阅读