堆和栈的区别

来源:互联网 发布:如何学游戏编程 编辑:程序博客网 时间:2024/06/10 16:37

堆和栈的区别

1.管理方式不同:栈由编译器自动管理,无需程序员手动控制,堆:产生和释放由程序员控制;
2.空间大小不同:栈的空间有限,堆的内存可以达到4G;
3.能否产生碎片不同:栈不会产生碎片,因为栈是一种先进后出的队列,堆则容易产生碎片,多次的new和delete会造成内存的不连续,从而造成大量的碎片;
4.生长方向不同:堆的生长方向是向上的,栈是向下的;
5.分配方式不同:堆是动态分配的,栈可以静态分配以可以动态的分配,但是栈的动态分配由编译器释放;
6:分配效率不同:栈是机器系统提供的数据结构,计算机底层堆栈提供支持,分配专门的寄存器提供存放栈的地址,压栈和出栈都有专门的指令,堆则是由c/c++函数库提供,库函数会按照一定的算法在堆内存中搜索可用的足够大小的空间,如果没有足够大小的空间,就有可能调用系统功能去增加程序数据段的内存空间,这样就有机会分到足够大小的内存,然后进行返回,显然,堆的效率比栈要低的多。

堆和栈相比由于大量new和delete的使用容易造成大量的内存碎片,由于没有专门的系统支持,效率很低,由于可能引发用户态和和心态的切换,内存的申请,代价变得更加昂贵,所以栈在程序中是应用最为广泛的,就算是函数的调用业利用栈去完成,函数调用过程中的参数,返回地址,EBP和局部变量都采用栈的方式存在,有时候分配大量的内存和空间,还是用堆好一些,尽量用栈而不是用堆,无论是栈还是用堆,都要防止越界现象的发生。

0 0
原创粉丝点击