- 1、本文档共44页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
动态数组 动态数组 引言 动态数组类对于操纵那些无法预知需要分配多少内存的数据集合是很有用的 动态数组随着元素增加而扩展,并且不需要创建成固定长度 这部分要解决 Symbian OS 提供的两类动态数组类 固定长度数组类 和标准 C++ [] 数组很相似 Symbian OS中的动态数组 基本掌握Symbian OS 中的动态数组 (CArrayX 和 RArray 系列) 掌握Symbian OS中动态数组的不同类型,注意内存分配 (平的(flat) 或者 分段(segmented)), 对象存储 (在数组中或者别处), 对象长度(定长或者不定长)和对象的所以权 区别在什么环境下使用基于段的缓冲区数组类而不是使用平数组类 Symbian OS中的动态数组 数组的逻辑设计 就象向量一样 动态数组的实现: 或者使用单独的堆单元,作为 “平坦” 缓冲区来保存数组元素 或者将数组缓冲区分成很多段,再用双向链表来管理这些一段一段的堆内存 Symbian OS中的动态数组 使用分段缓冲区更好 对于那些数组大小会频繁变化的情况 有很多元素频繁插入或者从数组中删除的情况 重复再分配单个平坦缓冲区可能导致堆内存抖动和复制 平坦缓冲区典型用于 高速的指针查找被作为重要考虑 数组大小的改变不是很频繁 典型的,插入和删除用分段缓冲区比平坦缓冲区更有效 因为它不要求修改点后面的所有元素都重新移动到一个新的地方 Symbian OS中的动态数组 Symbian OS 提供 创建和访问动态数组的两个不同的类家族 早期的Symbian OS数组类是 C 类 有许多不同类型的动态数组类 所有类名字以“CArray” 为前缀。例如 CArrayFixFlat, CArrayFixSeg 和 CArrayVarSeg 他们被统称为 “CArrayX” RArray 和 RPointerArray 类 后来引入它们来提高效率 CArrayX 类 CArrayX 类的数目 使数组类家族十分灵活 但是有明显的性能开销 (随后讨论) 不推荐使用 CArrayX 类 每个以 CArray 为前缀的类名后面会有如下字符串: Fix 意味着数组中的元素是等长的 而且是可以被复制的,所以他们可以保存在数组缓冲区内 Var 代表数组中元素是变长的 每个元素被保存在自己的堆中,数组缓冲区包含的是指向这些元素的指针 Pak 表明这是拥有变长元素的压缩数组(packed array) 数组元素被复制到数组缓冲区中,每个元素前面都有它的长度信息 Ptr 代表指向CBase派生类对象的指针数组 CArrayX 类 在 Fix,Var,Pak和Ptr之后,类名以以下字符结尾: Flat 例如 CArrayFixFlat,表明该类的动态内存在底层使用的是平坦缓冲区 Seg 例如 CArrayPtrSeg ,表明其使用的是段缓冲区 CArrayX 类 CArrayX 类的继承层次是很容易理解的 所有类是C类,最终从CBase 派生 每个类是瘦模板的特例化 数组的基类是下面类中的一个: CArrayVarBase CArrayPakBase CArrayFixBase CArrayX 类 CArrayVarSegclass T 和 CArrayVarFlatclass T 派生自 CArrayVarclass T 是CArrayVarBase 的模板特例化 CArrayVarBase 拥有一个对象 有一个动态缓冲区基类 CBufBase 的派生对象 用来存储数组元素 对象是下面类的具体实例 CBufFlat 是平坦动态存储缓冲区 CBufSeg 是分段动态缓冲区 动态数组的内存结构 可用的CArrayX 类 可能用到的CArrayX 类 RArray 和 RPointerArray RArray和 RPointerArray 都是 R 类 表明这是持有资源的类,这些资源就是它们所分配到的、用于保存数组的堆内存 RArrayclass T 是RArrayBase 类的一个瘦模版特例化 它保存具有相同大小的元素 它使用平坦的、类似向量的堆内存块来保存元素,在必要时还可以调整大小 RArray RArray 对象 是可以基于栈也可以基于堆的 对象使用完毕后调用 Close() 或者Reset()函数进行清除,也就是说释放那些为数组分配的内存 RArray::Close() 释放用于存储数组的内存并且关闭它 RArray::Reset() 释放与数组有关的内存 重置内部状态,从而可以让数组被重新使用 可以调用 Reset() 在对象离开作用域之前 因为所有与对象相关的堆内存将会被清除 RPointerArray RPointe
文档评论(0)