博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
堆和栈概念整理
阅读量:5949 次
发布时间:2019-06-19

本文共 873 字,大约阅读时间需要 2 分钟。

1.内存管理方式:

     堆:一般由程序员分配释放,程序员申请时需要指明大小,leg,C语言中malloc函数:p1=(char*)malloc(10),C++中:p2=new char[20].若程序员不去释放,当程序结束时可能由操作系统释放 ,注意其与数据结构的堆完全是两回事,分配方式类似于链表,分配释放的关键字:new,malloc,delete,free

     栈:由系统自动分配和释放,存放函数的参数值,局部变量等等,操作类似于数据结构的栈,eg:生命一个局部变量 int b,系统自动在栈中为其开拓空间

 

2.系统响应:

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

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

3.分配效率

    堆:是由new分配的内存,一般熟读比较慢,而且容易产生内存碎片,不过用起来比较方便。

    栈:由系统内存自动分配,程序员无法控制,速度较快。

4.存放内容:

    堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容有程序员安排

    栈:存放函数参数(由右往左入栈),函数中的局部变量。(多数C编译器下)

5.生长方向:

    堆:是由低地址向高地址扩展的数据结构

    栈:由高地址向低地址扩展的数据结构。

 6.碎片问题:

   堆:频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。

   栈:则不会存在这个问 题, 因为栈是先进后出的队列,且存储空间保持林旭。

 7.空间大小:

   堆:一般来讲在32位系统下,内存可以达到4G的空间,从这个角度来看堆内存几乎是没有什么限制的。

   栈:一般都是有一定的空间大小的。

详见:

转载地址:http://sksxx.baihongyu.com/

你可能感兴趣的文章
交换机之间的VLAN通信(trunk)
查看>>
heartbeat-gui
查看>>
关于一阶逻辑中实例化的可满足性问题
查看>>
cut命令用法讲解
查看>>
我的第一篇日志。
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
企业实战:mysql5.6数据库备份、恢复脚本
查看>>
CentOS7安装mysql
查看>>
RMB數字轉換中文
查看>>
基于rhel7.2的Zabbix平台搭建和部署(二)
查看>>
Html5本地存储和本地数据库
查看>>
JQ 循环切换DIV
查看>>
Android Fragment实践(二)
查看>>
Windows 64 位 mysql 5.7以上版本包解压安装
查看>>
知道双字节码, 如何获取汉字 - 回复 "pinezhou" 的问题
查看>>
TClientDataSet[14]: 测试 FindFirst、FindNext、FindLast、FindPrior、Found
查看>>
CentOS 6.3中配置bond多网卡负载均衡
查看>>
clamav 完整查杀 linux 病毒实战
查看>>
我的友情链接
查看>>