Symbian手记【四】 —— Symbian的容器

CArray系列容器

Symbian的设计者,非常喜欢复杂的继承结构和保罗万象的类,CArray系列的容器,就是在这种理念下的产物。CArray是顺序容器,相当于STL的vector + list,以及更多。

CArray系列容器,在继承的最底端,也就是可实例化使用的类,都采用CArrayXxxYxx的命名方式,即:CArray + 对象单元存储方式 + 对象段存储方式。所谓对象单元存储方式,就是表征容器中每一个单元数据,是如何存放的,在CArray中,主要有四种:

Flat,容器中的每个数据,都是等长同类的;

Var,容器中的每个数据长度,可以是不同的;

Pak,容器中的数据分成若干部分,每一部分都有一个leading-byte表示这一段的长度,形如描述符;

Ptr,容器存放CBase子类对象的指针数据。

每个容器,都有一个重要的参数,它是一个整数,称为Granularity,即,每一组元素的个数。组是CArray容器分配内存的单位,在Granularity范畴内,元素都按照上述四种模式进行存储,但是,Granularity总是一个有限的数,当容器中元素填满Granularity大小,就需要新增空间来存储。每次新增空间,都是Granularity个单元,每一组单元之间,有两种连接模式,一种是Fix,一种是Seg。


在Symbian OS Explained中有一幅经典图片,各种Array的存储模式,一目了然,盗窃过来,如上所示。从存储上来看,Flat方式就有如数组,一个挨一个存在一起,Ptr看上去和Var一致,指针一个挨一个存在一起,指向堆中对象,但从本质上来看,Ptr的实现与Flat的底层类似,而Var则是转为指针定制。Pak的存储有些怪异,每一坨元素有一个leading-byte的个数参数,让人不由怀疑,这玩意整个就是为描述符处心积虑准备的。

而段与段之间,Fix的犹如vector,每次扩大存储容量,都需要进行内存的重新分配,适合用在定长的场景,而不是变长。而Seg,类似于List,段之间链表方式连接,如果Granularity的一个Seg对象,就彻底沦为了链表,毫无疑问,如果你需要不是的增加存储容量,Seg方式Array应该是你的最爱。。。

在接口层面,CArray支持AppendL,InsertL,Delete等数据写入的接口,也支持At,operator [] 之类的数据读取接口,还支持Sort,Find,Compress等数据查找和处理的接口。具体实现和底层的存储相关联,具体细节没看过相关资料,只能无条件信任它的实现没有如此废柴。。。

时间: 2025-01-27 00:24:09

Symbian手记【四】 —— Symbian的容器的相关文章

Symbian手记【一】 —— Symbian命名法

每个美感尚存的C++ coder,第一次看到Symbian C++的程序,第一反应是:这鬼代码怎么缩进的?接下来,所有人会有疑问应该是:函数和类上的乱七八糟的前后缀是啥意思? 娃再丑也是爸妈生的,生成这模样虽然很无奈,但确实也是事出有因.在我看来,Symbian命名法的核心出发点,就是为了更好的内存资源管理.C++的人肉内存管理模式,在给人以控制到字节的快感的同时,也带了了麻烦到每行代码的烦恼.命名法,就是Symbian设计者憋出来用来辅助管理内存资源的方式之一. 类命名 Symbian的类,通

Symbian手记【五】 —— Symbian的异步框架

永远活在同步的流程里,无疑是我等码工最大的奢望之一.为了不阻塞UI,为了读写一陀陀数据,为了含辛茹苦的演算复杂的逻辑,为了大家和睦相处共同劳动,总是需要异步处理,你一下我一下共同完成任务.在Symbian中,做了一套机制来做这件事情,这就是Active Objects. Active Objects Active Object是一套事件驱动的多任务模型.在Symbian的标准线程中(除掉一些Java构造线程.原生C构造线程,等),都包含有一个消息循环,在循环中,会不停的查询注册在该线程所属的CA

Symbian手记【三】 —— Symbian的描述符

所谓描述符,一定程度上等同于字符串.只不过与C++的字符串不一样,Symbian中的描述符都是用一个附加的整数描述其长度,而不是以'\0'做终结符.因此,描述符可以表达任意数据,字符串或者二进制串. 描述符体系 打开任何一本关于Symbian介绍的书,都可以看到Symbian描述符那复杂的继承体系.它的基类是TDesC,顾名思义,T是代表它是T类,后缀C表示它是一个常量,其中数据无法修改.因此,它只是定义了一些字符处理的方法,包括查找.匹配.取子串等,而不包括任何修改其中数据的接口.可修改的描述

Symbian手记【二】 —— Symbian对象构造

C++的纯手工内存管理,确实是一个万恶之源.在对象构造时,有一个著名的内存泄漏隐患问题.比如一个类如下: class A { public: A() { a1 = new T1(); a2 = new T2(); ... an = new Tn(); } private: T1 * a1; T2 * a2; ... Tn * an; } 当你调用 new A() 进行分配的时候,一旦失败,可能导致内存的泄露.比如系统正吭哧吭哧分配到了a18,失败了,抛出异常了,或者返回空值了,前面a1 - a1

as3中四种存储容器的比较(array,object,vector,dictionary)

as3中有四种存放对象的容器:Array,Object,Vector,Dictionary:其他人在博客里提到过几种占cpu以内存或者速度的比较数据.其性能不是差很多,但是对于大型项目,或者需要移植到移动设备上的项目,这方面的优化还是很抢眼的. 首先要按照自己的需要选择合适的类型. array,一般语言都有,在这里就不要多说了,但是要知道他是索引数组,所以索引尽量使用int,这样可以提高速度,如果使用字符串,那么length方法可能和你想象的不一样(自己可以小测试一下 呵呵) object就是m

构建插件式的应用程序框架(四)-服务容器

IApplication接口是派生于IServiceContainer接口的.为什么要派生于IServiceContainer呢?我们来看看IServiceContainer的定义,它有几个AddService方法和RemoveService方法以及从IserviceProvider继承过来的GetService方法.Service本身是.NET设计时架构的基础,Service提供设计时对象访问某项功能的方法实现,说起来还真拗口.就我看来,ServiceContainer机制的本质就是解耦合,就

Symbian系统开发专题

symbian入门系列:applicatoin对象研究 symbian入门系列: framework symbian入门系列: document对象分析 Symbian学习总结-基础篇-Symbian C++中的异常处理 Symbian框架 Symbian游戏编程应用程序开发 Symbian开发工具Carbide简介 Symbian内存管理的二十二条军规 Symbian学习笔记(21)--原来还有这个工具wsdl2cpp,访问webserv Symbian学习笔记(20)--用gSOAP更简单地

Symbian手机操作系统知识扫盲篇

智能手机行业从去年开始升温,到现在已经进入一个飞速发展的阶段.智能手机结合了强大的计算能力以及开放的软件系统,从娱乐到商业都有着优秀的表现,未来智能手机可以提供上万种应用供用户使用更是提供了无限前景.随着智能手机的逐渐流行,它将不再局限于现在的高端手机,不仅将会改变人们的娱乐和休闲生活,而且将冲击我们现有的交流方式.购买智能手机时,除了了解智能手机的硬件配置,如屏幕,摄像头等,大家还会面对智能手机的各种操作系统,如Windows Mobile,Symbian,Linux,不同的操作系统也许把您搅

采用云计算容器的四个建议

在IT行业中,云计算容器不会很快消失.采纳并保持你的容器高效运行,请遵循以下四点建议和提示. 主导云计算市场作的云容器技术将作为为传统的基于管理程序的虚拟化一种替代.容器是轻载的,提供增强的可移植性,可以应用到移动平台之间无需返工或让应用程序的开发者重新设计.尽管其为开发人员提供了相当可观的利益,但容器仍然存在一些挑战,如可扩展性和管理. 为了满足人们对容器的需求,企业推出各种云容器服务.在市场上有如此多的选择,很难决定最终使用哪个容器平台或工具.在你选择云容器技术之前,你必须确定其容器是否值得