一、动态数组实现通常有两种方式:
1、用一个单独的堆单元作为连续的缓冲区来保存数组元素,通常针对量小和数组大小变化较小的情况
2、采用多段缓冲区,然后通过双向链表来管理,通常是针对量大并数组大小变化频繁的情况使用。
注意:因为动态数组的容量是动态变化的,当插入一条新的数组元素时,数组需要再分配堆内存,而再分配的堆内存的数目是由粒度来决定的。选取合适的粒度最重要,取得太小时,需要频繁进行分配,取得太多时又会造成存储空间的浪费。
二、Symbian OS 中的CArrayX
1、Fix,意味着数组中的元素具有相同的长度,而且是被复制的,所以它们可以保存在数据缓冲区内。
2、Var,代表数组中元素具有不同长度,每个元素都被保存在自己的堆单元中,数组缓冲区内包含的是指向这些元素的指针。
3、Pak,表明这是一个压缩数据,其中元素都具有不同长度。保存在数组缓冲区内,每个元素前部都有它的长度信息。
4、Ptr,代表CBase派生类对象指针的数组。
注:如果级组类名以”Flat“结尾,使用的是平坦缓冲区,以”Seg“结尾,使用段缓冲区。
内存布局:
三、RArray<class T>和RPointerArray<class T>
属于R类,需要调用Close()或者Reset()函数清除。当数组使用完成后,必须考虑这些对象的所有权。如果对象还在其他地方被持有,那么调用Close()或者Reset()清除即可,否则需要调用ResetAndDestory()或者针对所有对象调用Delete进行释放资源。
基于性能方面考虑,通常用RArray代替前面的类,因为RArray是基于R类的,具有更好的性能。并且RArray利用TLinearOrder<class T>提供更好的排序和查询等算法,同时提供了扩充的功能。