- 1、本文档共116页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
主讲老师:刘志强 三、 内存管理应用程序设计 内存管理的相关概念 内存数据空间的动态分配 内存代码空间的动态分配 1.内存管理 主要任务 对内存储器进行分配、变换、保护和扩充,存储管理还应该能够在内存和外存之间交换数据和代码。 在Windows操作系统下,存储器被保护起来,程序和用户无法直接访问,需要在程序中通过静态和动态两种方式来访问。 Windows的内存管理完成物理内存和虚拟内存之间的交换,虚拟内存是32位的,多达4GB的大小,内存管理还提供了一个核心服务,完成内存映射文件、写时复制内存和用户程序使用的大量和稀疏内存的管理。 两种使用内存的基本方法 静态方法 数组,例如 Student student[501] 动态方法 指针,例如 Student *student=new Student[count+1] Windows NT 内存管理 Windows可以管理4GB大小的空间;操作系统使用其中2GB空间,每个用户进程可以使用2GB的专用地址空间。 Win32 API提供: VirtualXXX形式的以页为单位的虚拟内存函数; CreateMapFile、MapViewofFile内存映射文件函数; HeapXXX堆栈函数。 内存管理 Windows NT在X86体系下虚拟地址空间的分布: 例3-6 动态申请虚拟内存 整数阶乘计算到13就会出错。怎么办? 使用动态申请的虚拟内存空间编写计算任何数的阶乘的程序。 解体思路: 计算较大数的阶乘的计算一般使用数组来存放阶乘的位数。但是C++中数组最大长度是10万,这将影响使用的范围。 可以通过使用动态内存分配(指针)来解决。 本程序采用动态申请虚拟内存空间的方法,不使用物理内存,而是使用虚拟内存,从而使求解问题的范围扩大。 程序算法 ① 从命令行接收输入并使用strtol函数将其转换为long型的整数(n为要求阶乘的数)。 ② 通过函数VirtualAlloc保留n×10240的地址空间,申请n×1024的地址空间。 ③ 调用计算阶乘函数lfac。 ④ 一位一位显示阶乘结果。 ⑤ 通过函数VirtulFree释放虚拟内存。 函数VirtualAlloc 用函数VirtualAlloc保留或申请虚拟内存空间。 该函数格式如下: LPVOID VirtualAlloc( LPVOID lpAddress, // 起始地址 DWORD dwSize, // 大小 DWORD flAllocationType, // 分配类型(MEM_COMMIT等) DWORD flProtect // 保权限(PAGE_READWRITE等) ); 函数VirtualFree 使用函数VirtualFree释放虚拟内存,函数格式: BOOL VirtualFree( LPVOID lpAddress, //起始地址 DWORD dwSize, //大小 DWORD dwFreeType //释放类型(MEM_RELEASE等) ); 源程序 #include iostream.h #include windows.h int lfac(int *a, int n) { int sum,sc; for(int i=0;in*1024;i++) //空间清零 a[i]=0; a[0]=1; //最低位设为1 for(i=2;i=n;i++) //n的阶乘的循环 { sc=0; for(int j=0;jn*1024;j++) //阶乘每一位处理的循环 { sum=a[j]*i+sc; //上一次进位值和当前计算结果求和 sc=sum/10; //存放进位数值 a[j]=sum%10; //将余数存入数组 } } if(sc0) return -1; else return 0; } 举例求5! a[0]=1; //最低位设为1 for(i=2;i=n;i++) //n的阶乘的循环 { sc=0; for(int j=0;jn*1024;j++) //阶乘每一位处理的循环 { sum=a[j]*i+sc; //上一次进位值和当前计算结果求和 sc=sum/10; //存放进位数值 a[j]=sum%10; //将余数存入数组 }
您可能关注的文档
- 两岸签订ECFA后财、会专业人员职场愿景与挑战大亚联合会.ppt
- 两个世界交会时.ppt
- 两个铁球同时着地.ppt
- 两税合一制度比较.ppt
- 两学一做高二党支部.ppt
- 临床路径管理柳州市人民医院质控科潘柳萍2012年2月16日.ppt
- 临床输血科的质量管理.ppt
- 临海市东塍镇中心校朱莹莹.ppt
- 七、玩具制作.ppt
- 三、二重积分的换元法.ppt
- 内蒙古赤峰冶金化工开发区巴林右旗产业园水土保持方案.docx
- 正定县均成鞋厂年产25万双EVA拖鞋改建项目环境影响报告表.docx
- 家长助考课件.pptx
- 家长培训课件资源公众号.pptx
- 专题11口语交际和综合实践-2025年五升六语文暑假专项提升(统编版)【含答案】.docx
- 专题09古诗文鉴赏-2025年三升四语文暑假专项提升(统编版)【含答案】.docx
- 比亚迪G3维修手册F3尊贵型培训课件.pdf
- 力帆大CVT资料401-SM-09-005(RDC15-FA维修手册V1.0)(第一部分).pdf
- 流形思维-用于可信推荐的动态双曲推理-计算机科学-机器学习-推荐系统.pdf
- HAPI-一种从人类偏好学习机器人面部表情的模型-计算机科学-人工智能-类人机器人.pdf
文档评论(0)