- 1、本文档共33页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
分析了Windows下不同动态内存分配方式
分析了Windows下不同的动态内存分配方式
这里的动态内存包含以下两个方面的内容:? 1.内存。这里的内存指的是进程的虚拟内存空间。在Win32环境下,每一个进程拥有独立的,大小为4G(0x0000 0000 ~ 0xFFFF FFFF)的虚拟内存空间。? 2.动态。这里的动态指的是进程虚拟内存空间中的动态内存区域。在一个进程的虚拟内存空间中,只有动态内存可以在运行是被应用程序自由的分配/使用/释放。
在Win32环境下,我们可以使用多种方式来分配/使用/释放动态内存,这些方式包括:1.Win32 API. 这些API包括VirtualXXX(),HeapXXX(),LocalAlloc(),GlobalAlloc()。2.C Run-Time Library.这些函数包括malloc(),free()。3.C++提供的关键词new和关键词delete。
有这么多的内存分配方式,我们在学习和实际项目中编码过程中常常会为使用那种方式而感到迷惑。他们的内部实现是否相同?他们之间有什么本质的区别?他们各自的使用场合又是怎样的? 本文试图通过深入探究他们的本质,为正确理解和使用他们提供一些依据。
首先,我们最好从全局的高度把握他们之间的关系。这里有一张图很好的描述了他们之间的层次关系:
这张图给了我们一个全景,仅从这张图我们就可以清楚地看到他们之间的层次关系:? 第一层:Win32 API作为系统的接口,提供了一组操作虚拟内存的接口;? 第二层:Heap作为虚拟内存的一部分,Win32 API又提供了一组操作Heap内存的接口,但是这些接口是建立在操作虚拟内存的接口的基础上。? 第三层:Windows平台下的C Run-Time Library 又利用Heap API来实现malloc和free。
由此我们可以看出,这些动态内存操作方式之间存有单一的层次关系,位于这个层次的最低层的是Virtual Memory API,可以说这些方式都是建立在Virtual Memory API的基础上。下面就从Virtual Memory API开始,逐层分析他们之间的区别:
一.Virtual Memory API? 作为Windows系统提供的最核心的对虚拟内存操作的接口,也作为其他几种方式的基础,Virtual Memory API应该在几种方式中是最通用,也是功能最强大的一种方式。如果想对Virtual Memory API的使用深入的了解,可以参阅《Programming Application for Windows》(By Jeffrey Richter)
二.Heap Memory API? 我们在学习进程内存空间映象的时候,也提到了Heap这个概念,那个时候Heap指的是一段由应用程序在运行时动态分配的内存段(Segment),和其他的内存段(代码段,数据段,栈段等)构成了进程的内存空间。而这里的Heap指的是进程拥有的一种对象(Windows中有很多对象,例如WINDOW,ICON,BRUSH),当我们创建一个Heap对象的时候,我们就可以获得这个对象的Handle,然后我们就可以使用这个handle来使用动态内存,最后销毁这个对象。
三.LocalAlloc/GlobalAlloc? 这两个函数是Win16 API中遗留下来的两个函数,Win32 API为了保持兼容性才包含了这两个函数。这两个函数内部是通过Heap Memory API来操作一个特殊的Heap对象:进程的默认堆对象。每一个进程在初始化的时候,都会创建一个默认的Heap对象,在进程结束的时候销毁这个默认的Heap对象。LocalAlloc和GblobalAlloc的区别仅表现在Win16环境下,在Win16环境下,内存的地址是通过段:段内偏移量来获取的,LocalAlloc()只能在同一段内分配内存,而GlobalAlloc可以跨越段边界访问内存。 在Win32环境下内存访问不存在这样的限制,所以他们表现出相同的功能。由于Heap Memory API完全可以实现他们两个的功能,所以在Win32下不推荐使用这两个函数。
四.malloc/free? 这两个函数是使用频率最高的两个函数,由于他们是标准C库中的一部分,所以具有极高的移植性。这里的移植性指的是使用他们的代码可以在不同的平台下编译通过,而不同的平台下的C Run-Time Library的具体实现是平台相关的,在Windows平台的C Run-Time Library中的malloc()和free()是通过调用Heap Memory API来实现的。值得注意的是C Run-Time Library拥有独立的Heap对象,我们知道,当一个应用程序初始化的时候,首先被初始化的是C
您可能关注的文档
- 【免费】浙大版概论,大数定律和中心极限定理.doc
- 【农学类】2011年成人高考专升本生态学基础试题和答案.doc
- 1995植物叶片SOD活性分析和植物抗性等级划分韩阳.pdf
- 10个易扣雅思写作扣分点-智课教育出国考试.pdf
- 10种句型让你SAT作文赢得考官青睐.pdf
- 【创新方案】2014年高考生物一轮复习【配套Word版文档】:第二章 第三讲 核酸 糖类与脂质.doc
- 【创新设计】(江苏专用)2014届高考数学二轮总复习 数列综合应用训练试题 文.doc
- 10个雅思口语发音最难单词.pdf
- 【南京中考数学试题和答案】2007.doc
- 【寒假提前学】数学七年级下册-第九章不等式和不等式组-折线统计图-寒假预习题.doc
- 2023年江苏省镇江市润州区中考生物二模试卷+答案解析.pdf
- 2023年江苏省徐州市邳州市运河中学中考生物二模试卷+答案解析.pdf
- 2023年江苏省苏州市吴中区中考冲刺数学模拟预测卷+答案解析.pdf
- 2023年江苏省南通市崇川区田家炳中学中考数学四模试卷+答案解析.pdf
- 2023年江西省吉安市中考物理模拟试卷(一)+答案解析.pdf
- 2023年江苏省泰州市海陵区九年级(下)中考三模数学试卷+答案解析.pdf
- 2023年江苏省苏州市高新二中中考数学二模试卷+答案解析.pdf
- 2023年江苏省南通市九年级数学中考复习模拟卷+答案解析.pdf
- 2023年江苏省南通市海安市九年级数学模拟卷+答案解析.pdf
- 2023年江苏省泰州市靖江外国语学校中考数学一调试卷+答案解析.pdf
最近下载
- 篮球进校园方案.pdf VIP
- CESA--2023-105《算力服务可信性评估规范》.pdf
- 部编版四年级语文上册《精卫填海》教材分析及相关素材.docx VIP
- 2024年共青团知识自测题库及答案.pdf VIP
- 环环相扣PPT立体图表.ppt
- 2024-2025学年八年级英语上学期期中考试(上海卷)(含解析)(牛津上海版).pdf VIP
- 药学专业知识一.pdf
- 湖北省武汉市洪山高级中学2024-2025学年高一上学期9月考试化学试卷.docx VIP
- 2024年公共卫生与预防医学继续教育平台“大学习”活动线上培训栏目考试题库(1392题).docx
- 地方标准审评工作细则.pdf VIP
文档评论(0)