资讯专栏INFORMATION COLUMN

堆与栈

April / 2229人阅读

摘要:堆与栈栈由编译器自动分配存放函数的参数值局部变量的值等其操作方式类似于数据结构中的栈堆一般由程序员分配释放若程序员不释放程序结束时可能由回收这里是指操作系统区别和联系申请方式堆由程序员自己申请并指明大小在语言中的函数栈由系统自动分配声明在函

堆与栈

栈(stack): 由编译器自动分配, 存放函数的参数值, 局部变量的值等. 其操作方式类似于数据结构中的栈.

堆(heap): 一般由程序员分配释放, 若程序员不释放, 程序结束时可能由OS回收. 这里OS是指: 操作系统(Operating System)

区别和联系:

申请方式

堆: 由程序员自己申请并指明大小, 在c语言中的malloc函数. eg: p1 = (char *)malloc(10);

栈: 由系统自动分配, eg: 声明在函数中的一个局部变量int b; 系统自动在栈中为b开辟空间;

申请后系统的响应

堆: 首先应该知道操作系统有一个记录空闲内存地址的链表, 当系统收到程序的申请时, 会遍历该链表, 寻找第一个空间大于所申请空间的堆结点, 然后将该结点从空闲结点链表中删除, 并将该结点的空间分配给程序, 对于大多数系统, 会在这块内存空间中的首地址处记录本次分配的大小, 这样代码中的delete语句才能正确的释放本内存空间. 另外, 由于找到的堆节点的大小不一定正好等于申请的大小, 系统会自动的将多余的那部分重新放入空闲链表中.

栈: 只要栈的剩余空间大于所申请空间, 系统将为程序员提供内容, 否则将异常提示栈溢出;

申请大小的限制

堆: 向高地址扩展的数据结构, 是不连续的内存区域. 这是由于系统是用链表来存储空闲内存地址的, 自然是不连续的, 而链表的遍历方向是由低地址向高地址. 堆的大小受限于计算机系统中有效的虚拟内存. 由此可见, 堆获得的空间比较灵活, 也比较大.

栈: 在Windows下, 栈是向低地址扩展的数据结构, 是一块联系的内存区域. 这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的, 在Windows下, 栈的大小是2M(也有人说1M, 总之是一个编译时就确定的常数), 如果申请的空间超过栈的剩余空间, 将提示overflow. 因此, 能从栈获得的空间较小.

申请效率

堆: 由new分配的内存, 一般速度比较慢, 而且容易产生内存碎片, 不过用起来最方便;

栈: 系统自动分配, 速度较快. 但是程序员无法控制;

前方高能!

通俗易懂的方式来解释堆与栈之间的区别

区别一(who)

堆: 可以把堆理解为 土堆 , 堆是由程序员负责分配和释放的. 而程序员又被称为码农, 即为 农名_(这里没有任何鄙视农名的意思, 我的爸妈也是农名, 这里只是作为一种便于理解的比喻), _农名 就是种地的(操作 _土堆_).

栈: 可以把栈理解为 , 读书人有知识、文化, 什么都是自动的、高科技, 所以栈是不用 农名 关心的, 由操作系统自己去申请和释放的.

区别二(where)

堆: 可以想象 土堆 被操作时 肯定没有那么智能化, 所以分配的时候会去查找合适的空间, 能找到放下 土堆 的容量的内存块的时候就分配给你.

栈: 是很智能化的, 所以操作系统会直接给你了.

区别三(how)

堆: 土堆 只能够从地上往上堆, 不可能相反, 那样的土堆除非有502(胶水). 所以是从下往上分配地址的.

栈: 我们可以想象成一个未来的图书馆, 图书馆把 都放在天花板上, 从上往下放, 而且不会掉下来. 所以栈的分配是自顶向下的, 而且坑定有空间限制. 所以如果栈上空间不足了就overflow了.

区别四(result)

堆: 土堆 农业相关, 所以什么都比较慢, 所以分配就比较慢了, 而且到处都是 小土堆 , 这就是碎片.

栈: 高科技的, 当然分配就很快, 至少比堆快, 而且不会有碎片, 人家是高科技的产物.

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/108254.html

相关文章

  • JVM的基本概念与维护调优

    摘要:栈因为是运行单位,因此里面存储的信息都是跟当前线程相关的信息。基本类型和对象的引用都是在存放在栈中,而且都是几个字节的一个数,因此在程序运行时,他们的处理方式是统一的。对象,是由基本类型组成的。 一、概念 数据类型 java虚拟机中,数据类型可以分为两类: 基本类型 引用类型 基本类型的变量保存原始值,即:他代表的值就是数值本身;而引用类型的变量保存引用值。基本类型包括:byte,sh...

    DevWiki 评论0 收藏0
  • JS中对内存的一些了解

    摘要:中对内存的一些了解在进行开发的过程中了解内存机制有助于开发人员能够清晰的认识到自己写的代码在执行的过程中发生过什么也能够提高项目的代码质量内存是怎么样的中变量存放有着原始值与引用值之分原始值原始的数据类型以及新加入的引用值等类型的值便是引用 JS中对内存的一些了解 在JS进行开发的过程中, 了解JS内存机制有助于开发人员能够清晰的认识到自己写的代码在执行的过程中发生过什么, 也能够提高...

    elliott_hu 评论0 收藏0
  • 堆和栈

    摘要:百度百科上对堆和栈进行了对比分析堆栈空间分配栈操作系统由操作系统自动分配释放,存放函数的参数值,局部变量的值等。堆栈缓存方式栈使用的是一级缓存,他们通常都是被调用时处于存储空间中,调用完毕立即释放。显然,堆的效率比栈要低得多。 相信很多程序员对于堆和栈的概念,总是感觉很朦胧,感觉在哪里听过见过,并没有深交。 在计算机领域,堆栈是一个不容忽视的概念,我们编写的C语言程序基本上都要用到。但...

    lscho 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<