zoukankan      html  css  js  c++  java
  • C/C++堆和栈的区别

    1.管理方式不同

    栈,由编译器自动管理,无需程序员手工控制;堆:产生和释放由程序员控制。

    2/空间大小不同

    栈的空间有限;堆内存可以达到4G,。

    3.能否产生碎片不同

    栈不会产生碎片,因为栈是种先进后出的队列。堆则容易产生碎片,多次的new/delete会造成内存的不连续,从而造成大量的碎片。

    4.生长方向不同

    堆的生长方式是向上的,栈是向下的。

    5.分配方式不同

    堆是动态分配的。栈可以是静态分配和动态分配两种,但是栈的动态分配由编译器释放。

    6.分配效率不同

    栈是机器系统提供的数据结构,计算机底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令。堆则是由C/C++函数库提供,库函数会按照一定的算法在堆内存中搜索可用的足够大小的空间,如果没有足够大小的空间(可能是由于内存碎片太多),就有可能调用系统功能去增加程序数据段的内存空间,这样就有机会分到足够大小的内存,然后进行返回。显然,堆的效率比栈要低得多。

    l  堆和栈相比,由于大量new/delete的使用,容易造成大量的内存碎片;由于没有专门的系统支持,效率很低;由于可能引发用户态和核心态的切换,内存的申请,代价变得更加昂贵。所以栈在程序中是应用最广泛的,就算是函数的调用也利用栈去完成,函数调用过程中的参数,返回地址,EBP和局部变量都采用栈的方式存放。所以,我们推荐大家  尽量用栈,而不是用堆。

    l  栈和堆相比不是那么灵活,有时候分配大量的内存空间还是用堆好一些。

    l  无论是堆还是栈,都要防止越界现象的发生。

    诸位正值青春年少,一定恣情放纵,贪恋香艳梅施之情,喜欢风流雅韵之事,洒脱木拘。然而诸位可知,草上露一碰即落,竹上霜一触即溶,此种风情难于长久。
  • 相关阅读:
    Easyui datagrid行内【添加】、【编辑】、【上移】、【下移】
    使用dynamic linq 解决自定义查询的若干弊端
    用CS的思维可以指导BS的项目吗?
    那些让 Web 开发者们深感意外的事情
    asp.net实现access数据库分页
    那些相见恨晚的 JavaScript 技巧
    Javascript的执行过程详细研究
    asp.net 遍历文件夹下全部子文件夹并绑定到gridview上
    无废话JavaScript(下)
    asp.net DataTable导出 excel的方法记录(第三方)
  • 原文地址:https://www.cnblogs.com/shilipojianshen/p/13584451.html
Copyright © 2011-2022 走看看