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

    # 堆和栈的区别

      + 管理方式不同:堆中资源由程序员控制,容易产生内存泄漏,栈资源由编译器自动管理,无需手动控制;
      + 内存管理机制不同:系统有一个记录空闲列表的链表,当系统收到程序申请时,遍历该链表,寻找第一个空间大于申请空间的堆节点,删除空闲节点列表中的该节点,并将该节点空间分配给程序(大多数系统都会在这块内存空间首地址记录本次分配的大小,这样delete时才会释放本内存空间,另外系统会将多余的部分重新放入到空闲列表中);对于栈来说,只要栈的剩余空间大于所申请空间系统就为程序提供内存,否则报异常提示栈溢出。
      + 空间大小不同:堆是不连续的内存区域(因为系统使用链表来存储空间内存地址。自然是不连续的),堆大小受限于计算机系统中有效的虚拟地址(32位系统理论上是4G),所以堆的空间比较灵活,也比较大;栈是一块连续的内存区域,大小是操作系统预定好的,默认大小基本都是 MB级别。可调整。
      + 碎片问题不同:对于堆来说,频繁的调用 new/delete 会造成大量的碎片,使程序效率降低;对于栈它是一块连续的区域,不会产生碎片问题。
      + 生长方向不同:堆向上,向高地址方向增长;栈向下,向低地址方向增长。
      + 分配方式不同:堆都是动态分配;栈由静态分配和动态分配,静态分配由编译器完成(局部变量分配),动态分配由 malloc 函数分配,但栈的动态分配资源由编译器释放,无需程序员实现;
      + 分配效率不同:堆是由 C/C++ 函数库实现,机制复杂,所以堆的效率要比栈低;栈是由系统提供的数据结构,计算机在底层对栈进行支持,分配专门寄存器存放栈地址。栈操作由专门指令;
  • 相关阅读:
    二分查找:思路很简单,细节是魔鬼
    今天遇到了 X-Y PROBLEM
    《工匠精神》读书笔记
    养成好的职业习惯
    php xdebug 调试
    Dockerfile的常见命令
    docker制作镜像
    脱坑笔记
    Java中代理
    2、遇到多个构造器参数的时候要考虑使用构建器
  • 原文地址:https://www.cnblogs.com/wanghao-boke/p/14623375.html
Copyright © 2011-2022 走看看