3.4堆和栈的使用
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
各种内存分配方法的对比
直接分配内存
优点 大的内存块最好是直接分配虚拟内存. 是最灵活的内存分配类型. 缺点 担心页面的粒度并需跟踪保留页面和 提交页面的情况.
本地堆
优点 使用便利,不需要用户自己创建. 可根据需要来增加. 缺点 多次访问后会产生碎片. 系统没有回收碎片的机制.
单独的堆
优点 完全根据需要来创建. 可以随时释放其内存,从而将内存碎 片问题消灭在萌牙状态. 缺点 须手工创建和释放相应的内存
堆的操作函数
LocalAlloc LocalFree HeapCreate HeapFree 在堆中申请内存 释放使用过的内存 创建堆 释放堆
堆的碎片
在Windows CE5.0创建的堆中,所申请的 内存块不能够移动,多次创建内存块, 释放内存块会产生内存碎块. 当需要分配一个大一点的,连续的内存 块时,本来空闲的内存块加起来足够大, 但是这些内存块是分隔的,系统无法分 配这些内存碎片.
内存的页
内存是以页为单位分配的. 内存页的大小与具体的CPU有关. 页的大小一般是1KB,4KB,64KB等.
本地堆
默认情况下,Windows CE为本地堆保留 192KB的虚拟内存空间,如果不够的话, 可用函数VirtualAlloc()申请更多的内存. 192KB的虚拟内存并不立刻提交分配物 理内存. 当堆中的块被释放时,系统将查看是否 整个页都已经被释放,如果是那个页将 被回收.
在本地堆中分配内存
堆内分配内存可以任意大小,单位为字 节,所分配的内存称为块. 使用完后注意要回收分配的内存. 在堆中申请内存可使用malloc/free, malloc/free new/delete,LocalAlloc/LocallFree等函数. Windows CE5.0只支持堆中固定块的分配, 这样随着时间的推移,多次创建释放内 存块,堆内就会产生大量内存的碎片.
碎片的解决
程序员如果要பைடு நூலகம்繁的在堆中创建,释放 内存块的话,最好自己创建一个单独的 堆,而不用默认的堆. 在使用结束后要及时释放掉该内存堆.
栈
栈
栈是进程中的一个重要的数据结构.函 数使用栈传递参数,函数中的局部变量 也存放在栈中. 每个线程都有一个栈,在线程创建时由 系统为其分配. 线程栈的大小默认为64KB,可以通过使 用编译器的/STACKSIZE参数,调整栈的 大小.
栈
优点 易于使用 缺点 低内存配置时需要考虑栈的大小
静态数据
优点 静态数据的页面总是要分配的 程序设计时,常量数据常置于Read Only区域.
�
项目6:内存分配- 项目 :内存分配-PDA的内存管理 (2) 的内存管理 本节课程主要知识点 堆 栈 各种内存分配方法的对比
重点和难点
重点 堆和栈的基本概念 难点 堆的使用
堆
堆
堆是一段连续的虚拟地址空间.每一个 进程都管理着一个堆. 应用程序在堆中可以动态地分配,释放 所需大小的内存块. 在堆内分配内存块可以是任意大小的, 而直接分配内存就必须以内存页为单位.
栈的使用
栈不能由用户程序自己创建. 栈的溢出会导致应用程序的退出,程序 设计时一定要注意. 不要在较低内存配置的情况下使用大量 的栈.
静态数据
Windows CE为应用程序的静态数据分配 了read/write和read only两个内存区域. 这两个内存区域以页面为单位来分配内 存. 应用程序设计时要尽量保证静态数据区 域没有空间的浪费.