堆和栈
<ul>
<li><a href="https://www.cnblogs.com/xiangshihua/p/13266920.html">https://www.cnblogs.com/xiangshihua/p/13266920.html</a></li>
</ul>
<h2>堆栈特点</h2>
<ul>
<li>堆:队列优先,先进先出</li>
<li>栈:先进后出</li>
</ul>
<h2>堆栈空间分配</h2>
<ul>
<li>栈
<ul>
<li>由操作系统自动分配释放,存放函数的参数值,局部变量的值等</li>
<li>其操作方式类似于数据结构中的栈。</li>
</ul></li>
<li>堆(操作系统)
<ul>
<li>一般由程序员分配释放,若程序员不释放,程序结束时可能由操作系统回收,分配方式类似于链表</li>
</ul></li>
</ul>
<h2>堆栈操作系统缓存方式</h2>
<ul>
<li>栈使用一级缓存,他们通常都是被调用时处于存储空间中,调用完毕立即释放。</li>
<li>堆是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。
<ul>
<li>所以调用这些对象的速度要相对来得低一些。</li>
</ul></li>
</ul>
<h2>堆栈数据结构区别</h2>
<ul>
<li>栈
<ul>
<li>一种先进后出的数据结构。类似于取放好的盘子,最后放的先使用</li>
</ul></li>
<li>堆
<ul>
<li>可以被看成是一棵树,如:二叉树结构</li>
</ul></li>
</ul>
<h2>堆与栈的主要区别</h2>
<ul>
<li>管理方式
<ul>
<li>栈:是由编译器自动管理,无需手工控制</li>
<li>堆:释放工作由程序员控制,容易产生内存泄露</li>
</ul></li>
<li>空间大小
<ul>
<li>堆:存储空间很大</li>
<li>一般来讲在32位系统下,堆内存可以达到4G的空间,从这个角度来看堆内存几乎是没有什么限制的</li>
<li>栈:存储空间很小</li>
</ul></li>
<li>碎片问题
<ul>
<li>堆:频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。</li>
<li>栈:频繁的new/delete不会造成内存空间不连续,因为栈是先进后出的队列。</li>
</ul></li>
<li>生长方向
<ul>
<li>堆:生长方向是向上,向着内存地址增加的方向;</li>
<li>栈:生长方向是向下,向着内存地址减小的方向。</li>
</ul></li>
<li>分配方式
<ul>
<li>堆:动态分配的,没有静态分配的堆。</li>
<li>栈:有2种分配方式:静态分配和动态分配。</li>
<li>静态分配是编译器完成的,比如局部变量的分配。</li>
<li>栈的动态分配和堆不同,他的动态分配是由编译器进行释放,无需我们手工实现。</li>
</ul></li>
<li>分配效率
<ul>
<li>栈:是机器系统提供的数据结构,计算机会在底层对栈提供支持:</li>
<li>分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。</li>
<li>堆:是C/C++函数库提供,它的机制很复杂</li>
<li>例如为了分配一块内存,库函数会按照一定的算法(具体的算法可以参考数据结构/操作系统),</li>
<li>在堆内存中搜索可用的足够大小的空间,如果没有足够大小的空间(可能是由于内存碎片太多),就有可能调用系统功能去增加程序数据段的内存空间,这样就有机会分到足够大小的内存,然后进行返回。堆的效率比栈要低得多。</li>
</ul></li>
</ul>