PHP学习心得


堆和栈

<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>

页面列表

ITEM_HTML