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

    # 堆和栈的区别

      + 管理方式不同:堆中资源由程序员控制,容易产生内存泄漏,栈资源由编译器自动管理,无需手动控制;
      + 内存管理机制不同:系统有一个记录空闲列表的链表,当系统收到程序申请时,遍历该链表,寻找第一个空间大于申请空间的堆节点,删除空闲节点列表中的该节点,并将该节点空间分配给程序(大多数系统都会在这块内存空间首地址记录本次分配的大小,这样delete时才会释放本内存空间,另外系统会将多余的部分重新放入到空闲列表中);对于栈来说,只要栈的剩余空间大于所申请空间系统就为程序提供内存,否则报异常提示栈溢出。
      + 空间大小不同:堆是不连续的内存区域(因为系统使用链表来存储空间内存地址。自然是不连续的),堆大小受限于计算机系统中有效的虚拟地址(32位系统理论上是4G),所以堆的空间比较灵活,也比较大;栈是一块连续的内存区域,大小是操作系统预定好的,默认大小基本都是 MB级别。可调整。
      + 碎片问题不同:对于堆来说,频繁的调用 new/delete 会造成大量的碎片,使程序效率降低;对于栈它是一块连续的区域,不会产生碎片问题。
      + 生长方向不同:堆向上,向高地址方向增长;栈向下,向低地址方向增长。
      + 分配方式不同:堆都是动态分配;栈由静态分配和动态分配,静态分配由编译器完成(局部变量分配),动态分配由 malloc 函数分配,但栈的动态分配资源由编译器释放,无需程序员实现;
      + 分配效率不同:堆是由 C/C++ 函数库实现,机制复杂,所以堆的效率要比栈低;栈是由系统提供的数据结构,计算机在底层对栈进行支持,分配专门寄存器存放栈地址。栈操作由专门指令;
  • 相关阅读:
    【转】Eclipse插件开发之基础篇(1) 插件开发的基础知识
    js获取周.html
    Go语言 基础
    MySQL replace into
    元认知:思考“何为思考”
    redis 流水线
    关于Blog现象的一些思考。
    [LCS]LCS2005服务器应用程序
    [WAP]dotNet在WAP应用开发中实现按指定页数翻页的解决方案
    [Cache]深入学习Enterprise Library for .NET Framework 2.0的Cache机制——分析篇
  • 原文地址:https://www.cnblogs.com/wanghao-boke/p/14623375.html
Copyright © 2011-2022 走看看