cocos2dx学习笔记:CCArray-removeObjectAtIndex

cocos2dx学习笔记:CCArray-removeObjectAtIndex,第1张

概述http://cstriker1407.info/blog/cocos2dx-study-notes-ccarray/ 最近学习了下CCArray,想看下它的内部实现,搞清楚存储方式,以便后面使用起来更高效。 打开CCArray的源码,看了下,发现它其实内部是数组的实现形式,而且CCArray的所有函数只是包装了下ccArray的实现。 CCArray.h:   class CC_DLL CCAr

http://cstriker1407.info/blog/cocos2dx-study-notes-ccarray/

最近学习了下CCArray,想看下它的内部实现,搞清楚存储方式,以便后面使用起来更高效。

打开CCArray的源码,看了下,发现它其实内部是数组的实现形式,而且CCArray的所有函数只是包装了下ccArray的实现。

CCArray.h:
class CC_DLL CCArray : public CCObject
{
public:
staticCCArray* create();
。。。。。
。。。。。
public:
ccArray* data;
。。。。。
。。。。。
};

通过.h文件可以发现,CCArray的所有 *** 作其实最后都是 *** 作的它的变量data,这个变量data的类型为ccArray,它是个结构体,真正的实现了Array的各种方法。

ccCArray.h:
typedef struct _ccArray {
unsignedint num,max;
CCObject** arr;
} ccArray;
/** Allocates and initializes a new array with specifIEd capacity */
ccArray* ccArrayNew(unsigned int capacity);
/** Frees array after removing all remaining objects. Silently ignores nil arr. */
voID ccArrayFree(ccArray*& arr);
/** Doubles array capacity */
voID ccArrayDoubleCapacity(ccArray *arr);
。。。。。。
。。。。。。

到这里就很清楚了,ccArray是一个结构体,里面封装了一个数组的指针。因此通过CCArray进行的各种 *** 作其实内部是 *** 作的一个数组指针@H_502_377@。
那么就很容易的得出结论:

1)随机查找和修改的速度很快。
2)在指定的位置插入和删除元素速度很慢。
3)扩容消耗很大。@H_502_377@
后续使用时要注意。不过个人感觉cocos2dx代码中仍然有问题,那就是替换:

voID CCArray::replaceObjectAtIndex(unsigned intindex,CCObject* pObject,boolbReleaSEObject/* = true*/)
{
ccArrayInsertObjectAtIndex(data,pObject,index);
ccArrayRemoveObjectAtIndex(data,index+1);
}
ccCArray.cpp:
/** Inserts a value at a certain position. Behavior undefined if array doesn't have enough capacity */
voID ccCArrayInsertValueAtIndex( ccCArray *arr,voID* value,unsignedint index)
{
CCAssert( index < arr->max,"ccCArrayInsertValueAtIndex: invalID index");
unsignedint remaining = arr->num - index;
// make sure it has enough capacity
if(arr->num + 1 == arr->max)
{
ccCArrayDoubleCapacity(arr);
}
// last Value doesn't need to be moved
if( remaining > 0) {
// tex coordinates
memmove((voID*)&arr->arr[index+1],(voID*)&arr->arr[index],sizeof(voID*) * remaining );
}
arr->num++;
arr->arr[index] = value;
}
/** Removes object at specifIEd index and pushes back all subsequent objects.
Behavior undefined if index outsIDe [0,num-1]. */
voID ccArrayRemoveObjectAtIndex(ccArray *arr,unsigned intindex,boolbReleaSEObj/* = true*/)
{
CCAssert(arr && arr->num > 0 && index < arr->num,"InvalID index. Out of bounds");
if(bReleaSEObj)
{
CC_SAFE_RELEASE(arr->arr[index]);
}
arr->num--;
unsignedint remaining = arr->num - index;
if(remaining>0)
{
memmove((voID*)&arr->arr[index],(voID*)&arr->arr[index+1],remaining * sizeof(CCObject*));
}
}
voID ccArrayDoubleCapacity(ccArray *arr)
{
arr->max *= 2;
CCObject** newArr = (CCObject**)realloc( arr->arr,arr->max *sizeof(CCObject*) );
// will fail when there's not enough memory
CCAssert(newArr != 0,"ccArrayDoubleCapacity Failed. Not enough memory");
arr->arr = newArr;
}

通过上述代码可以发现,移除,插入,扩容都有内存 *** 作,因此最好在使用CCArray时考虑好初始容量。

另外,CCArray为了提供更快速的删除功能,增加了方法 fastremove*,这里分析下实现:

voID ccArrayFastRemoveObjectAtIndex(ccArray *arr,unsigned intindex)
{
CC_SAFE_RELEASE(arr->arr[index]);
unsignedint last = --arr->num;
arr->arr[index] = arr->arr[last];
}

根据代码可知,快速删除的实质是将数组的最后一个元素添加到这个空缺来,这样就要注意的是数组内部的顺序已经变了@H_502_377@
测试代码如下:

CCArray *arr = CCArray::createWithCapacity(5);
arr->addobject(CCString::create("A"));
arr->addobject(CCString::create("B"));
arr->addobject(CCString::create("C"));
arr->addobject(CCString::create("D"));
arr->addobject(CCString::create("E"));
cclOG("init");
CCObject *itemStr = NulL;
CCARRAY_FOREACH(arr,itemStr)
{
cclOG("%s",((CCString *)itemStr)->getCString());
}
cclOG("fast remove");
arr->fastRemoveObjectAtIndex(2);
CCARRAY_FOREACH(arr,itemStr)
{
cclOG("%s",((CCString *)itemStr)->getCString());
}

输出:

init
A
B
C
D
E
fast remove
A
B
E
D

如下图:

总结

以上是内存溢出为你收集整理的cocos2dx学习笔记:CCArray-removeObjectAtIndex全部内容,希望文章能够帮你解决cocos2dx学习笔记:CCArray-removeObjectAtIndex所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1061006.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存