概述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的实现。
class CC_DLL CCArray : public CCObject |
通过.h文件可以发现,CCArray的所有 *** 作其实最后都是 *** 作的它的变量data,这个变量data的类型为ccArray,它是个结构体,真正的实现了Array的各种方法。
typedef struct _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 int index,CCObject* pObject, bool bReleaSEObject /* = true*/ ) |
ccArrayInsertObjectAtIndex(data,pObject,index); |
ccArrayRemoveObjectAtIndex(data,index+1); |
/** Inserts a value at a certain position. Behavior undefined if array doesn't have enough capacity */ |
voID ccCArrayInsertValueAtIndex( ccCArray *arr, voID * value,unsigned int index) |
CCAssert( index < arr->max, "ccCArrayInsertValueAtIndex: invalID index" ); |
unsigned int 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 |
memmove (( voID *)&arr->arr[index+1],( voID *)&arr->arr[index], sizeof ( voID *) * remaining ); |
/** Removes object at specifIEd index and pushes back all subsequent objects. |
Behavior undefined if index outsIDe [0,num-1]. */ |
voID ccArrayRemoveObjectAtIndex(ccArray *arr,unsigned int index, bool bReleaSEObj /* = true*/ ) |
CCAssert(arr && arr->num > 0 && index < arr->num, "InvalID index. Out of bounds" ); |
CC_SAFE_RELEASE(arr->arr[index]); |
unsigned int remaining = arr->num - index; |
memmove (( voID *)&arr->arr[index],( voID *)&arr->arr[index+1],remaining * sizeof (CCObject*)); |
voID ccArrayDoubleCapacity(ccArray *arr) |
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" ); |
通过上述代码可以发现,移除,插入,扩容都有内存 *** 作,因此最好在使用CCArray时考虑好初始容量。
另外,CCArray为了提供更快速的删除功能,增加了方法 fastremove*,这里分析下实现:
voID ccArrayFastRemoveObjectAtIndex(ccArray *arr,unsigned int index) |
CC_SAFE_RELEASE(arr->arr[index]); |
unsigned int 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" )); |
CCObject *itemStr = NulL; |
CCARRAY_FOREACH(arr,itemStr) |
cclOG( "%s" ,((CCString *)itemStr)->getCString()); |
arr->fastRemoveObjectAtIndex(2); |
CCARRAY_FOREACH(arr,itemStr) |
cclOG( "%s" ,((CCString *)itemStr)->getCString()); |
输出:
如下图:
总结
以上是内存溢出为你收集整理的cocos2dx学习笔记:CCArray-removeObjectAtIndex全部内容,希望文章能够帮你解决cocos2dx学习笔记:CCArray-removeObjectAtIndex所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
评论列表(0条)