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

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

堆栈空间分配

栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。
堆栈缓存方式
栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放。
堆则是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。

一个由C/C++编译的程序占用的内存分为以下几个部分

1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数名,局部变量的名等。其操作方式类似于数据结构中的栈。
2、堆区(heap)— 由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。
3、静态区(static)—全局变量和局部静态变量的存储是放在一块的。程序结束后由系统释放。
4、文字常量区—常量字符串就是放在这里的,程序结束后由系统释放 。
5、程序代码区— 存放函数体的二进制代码。

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

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

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

你可能感兴趣的文章
mysql分片备份不一致问题_光大银行分布式实战:国内最大缴费平台的数据库架构转型...
查看>>
java 参数对象一起封装成json_0基础掌握Django框架(29)HttpResponse对象
查看>>
mysql导入没有选择字段_[MySQL]load data local infile向MySQL数据库中导入数据时,无法导入和字段不分离问题。...
查看>>
php对mysql最匹配输出_php – 在十进制列中查找MySQL中最接近的匹配项
查看>>
thinkphp5 mysql缓存_thinkphp+redis实现秒杀,缓存等功能
查看>>
usb一转多 树莓派zero_windows下一根数据线玩转树莓派zero (w)
查看>>
mysql写保护_84个MySQL性能优化的首选技巧
查看>>
mysql onlibe all_MySQL--Online DDL
查看>>
mysql qps 计算_请问MYSQL数据库QPS,TPS采用哪种计算方式?
查看>>
python to_excel参数解释_pandas中read_excel() 和 to_excel()各参数详解
查看>>
python列表输出奇数_Python程序在列表中打印奇数
查看>>
mysql下存在的风险_MySQL部分表复制配置下存在的运维风险、原因及一种方案
查看>>
在python中的占位符中、请你选出不属于占位符的选项_在信息组织和存储中,最基本的单位是( )。...
查看>>
java date 转换sql date_如何将java.util.Date转换为java.sql.Date?
查看>>
java 编写cgi_编写CGI小结(Java)
查看>>
java内存泄露 垃圾回收_Java中内存泄露及垃圾回收机制
查看>>
rife java_Java世界的ruby on rails — rife (转)
查看>>
java yang模型_java 深入理解jvm内存模型 jvm学习笔记
查看>>
java 任务栏_java 如何将当前程序隐藏到任务栏(类似windows上的其他程序)
查看>>
java编写一个小学辅助软件_高分求用Java编写的一个小软件
查看>>