- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
全面介绍Windows内存管理机制及C内存分配实例(三):虚拟内存
本文背景:
在编程中,很多Windows或C++的内存函数不知道有什么区别,更别谈有效使用;根本的原因是,没有清楚的理解操作系统的内存管理机制,本文企图通过简单的总结描述,结合实例来阐明这个机制。
本文目的:
对Windows内存管理机制了解清楚,有效的利用C++内存函数管理和使用内存。
本文内容:
本文一共有六节,由于篇幅较多,故按节发表。其他章节请看本人博客的Windows内存管理及C++内存分配实例(一)(二)(四)(五)和(六)。
?
3.????? 内存管理机制--虚拟内存 (VM)
???????? 虚拟内存使用场合
虚拟内存最适合用来管理大型对象或数据结构。比如说,电子表格程序,有很多单元格,但是也许大多数的单元格是没有数据的,用不着分配空间。也许,你会想到用动态链表,但是访问又没有数组快。定义二维数组,就会浪费很多空间。
它的优点是同时具有数组的快速和链表的小空间的优点。
?
???????? 分配虚拟内存
如果你程序需要大块内存,你可以先保留内存,需要的时候再提交物理存储器。在需要的时候再提交才能有效的利用内存。一般来说,如果需要内存大于1M,用虚拟内存比较好。
?
???????? 保留
用以下Windows 函数保留内存块
VirtualAlloc (PVOID 开始地址,SIZE_T 大小,DWORD 类型,DWORD 保护属性)
一般情况下,你不需要指定“开始地址”,因为你不知道进程的那段空间是不是已经被占用了;所以你可以用NULL。“大小”是你需要的内存字节;“类型”有MEM_RESERVE(保留)、MEM_RELEASE(释放)和MEM_COMMIT(提交)。“保护属性”在前面章节有详细介绍,只能用前六种属性。
如果你要保留的是长久不会释放的内存区,就保留在较高的空间区域,这样不会产生碎片。用这个类型标志可以达到:
MEM_RESERVE|MEM_TOP_DOWN。
C++程序:保留1G的空间
LPVOID pV=VirtualAlloc(NULL,1000*1024*1024,MEM_RESERVE|MEM_TOP_DOWN,PAGE_READWRITE);
if(pV==NULL)
cout没有那么多虚拟空间!endl;
MEMORYSTATUS memStatusVirtual1;
GlobalMemoryStatus(memStatusVirtual1);
cout虚拟内存分配:endl;
printf(指针地址=%x/n,pV);
cout减少物理内存=memStatusVirtual.dwAvailPhys-memStatusVirtual1.dwAvailPhysendl;
cout减少可用页文件=memStatusVirtual.dwAvailPageFile-memStatusVirtual1.dwAvailPageFileendl;
cout减少可用进程空间=
memStatusVirtual.dwAvailVirtual-memStatusVirtual1.dwAvailVirtualendlendl;
结果如下:
?
可见,进程空间减少了1G;减少的物理内存和可用页文件用来管理页目和页表。但是,现在访问空间的话,会出错的:
int * iV=(int*)pV;
//iV[0]=1;现在访问会出错,出现访问违规
?
???????? 提交
你必须提供一个初始地址和提交的大小。提交的大小系统会变成页面的倍数,因为只能按页面提交。指定类型是MEM_COMMIT。保护属性最好跟区域的保护属性一致,这样可以提高系统管理的效率。
C++程序:提交100M的空间
LPVOID pP=VirtualAlloc(pV,100*1024*1024,MEM_COMMIT,PAGE_READWRITE);
if(pP==NULL)
cout没有那么多物理空间!endl;
int * iP=(int*)pP;
iP[0]=3;
iP[100/sizeof(int)*1024*1024-1]=5;//这是能访问的最后一个地址
//iP[100/sizeof(int)*1024*1024]=5;访问出错
???????? 保留提交
你可以用类型MEM_RESERVE|MEM_COMMIT一次全部提交。但是这样的话,没有有效地利用内存,和使用一般的C++动态分配内存函数一样了。
?
???????? 更改保护属性
更改已经提交的页面的保护属性,有时候会很有用处,假设你在访问数据后,不想别的函数再访问,或者出于防止指针乱指改变结构的目的,你可以更改数据所处的页面的属性,让别人无法访问。
VirtualProtect (PVOID 基地址,SIZE_T 大小,DWORD 新
您可能关注的文档
- 企业法律风险防范培训之职务经济犯罪.doc
- 休闲旅游项目规划初探.doc
- 休憩节点的分类.doc
- 众联酒店管理软件销售合同.doc
- 优势心理辅导基本提纲.doc
- 优化劳动力管理 推动HR效能转变.ppt
- 优化设计在汽车行业应用论文.doc
- 优秀个人简历模板数篇.doc
- 优秀人才迎新春团拜会上的讲话.doc
- 优化服务-祝您成.ppt
- 商道融绿&自然资源保护协会-钢铁企业低碳转型融资工具箱.pdf
- AI时代下中国低、零代码市场发展研究报告(2025).pdf
- 英文OECD-斯洛文尼亚通过合作加强公共采购:前进之路.pdf
- 医院意识形态工作专题党课讲稿(重制版):以意识形态新成效,推动卫生院事业新发展.doc
- 医院意识形态工作专题党课讲稿(重制版):以意识形态新成效,推动卫生院事业新发展.pptx
- 2025年国产数字化升级标杆实践报告.pdf
- 2025年越南品牌100强.pdf
- 人工智能战略践行手册:从试点到全面落地.pdf
- 2025稀土的战略必要性:市场动态与地缘政治如何驱动多元化投资路径报告.pdf
- 2025年移动互联网报告.pdf
文档评论(0)