cocos2d-x,CCArray源码学习
来源:互联网 发布:数据库设计入门经典 编辑:程序博客网 时间:2024/04/29 18:51
看了一下cocos2d-x中的CCArray源码!大多数代码可以很容易理解的,我对插入和删除的实现比较感兴趣,所以重点看了一下!
首先看看CCArray的主要数据结构:
typedef struct _ccArray {
unsigned int num, max;
CCObject** arr;
} ccArray;
一个指针数组,一个当前数量和一个最大数量。所以CCArray的主要操作其实都是对这个结构体的操作。
大家都知道数组是不能实现随机插入和删除的,要实现必须对整个数组做出改动!
/** Inserts an object at index */
void ccArrayInsertObjectAtIndex(ccArray *arr, CCObject* object, unsigned int index)
{
CCAssert(index<=arr->num, "Invalid index. Out of bounds");
CCAssert(object != NULL, "Invalid parameter!");
ccArrayEnsureExtraCapacity(arr, 1);
unsigned int remaining = arr->num - index;
if( remaining > 0)
{
memmove((void *)&arr->arr[index+1], (void *)&arr->arr[index], sizeof(CCObject*) * remaining );
}
object->retain();
arr->arr[index] = object;
arr->num++;
}
CCArry就是通过memmove函数实现数组随机插入后的移动。
memmove函数实现和memcopy类似,不同的是memmove会检查内存是否有重合部分,如果有就从尾部开始拷贝。这里有这两个函数的实现:
void * __cdecl memcpy ( void * dst,const void * src,size_t count)
{
void * ret = dst;
while (count--)
{ // 注意, memcpy函数没有处理dst和src区域是否重叠的问题
*(char *)dst = *(char *)src;
dst = (char *)dst + 1;
src = (char *)src + 1;
}
return(ret);
}
void * __cdecl memmove ( void * dst,const void * src,size_t count)
{
void * ret = dst;
if (dst <= src || (char *)dst >= ((char *)src + count))
{
// 若dst和src区域没有重叠,则从起始处开始逐一拷贝
while (count--)
{
*(char *)dst = *(char *)src;
dst = (char *)dst + 1;
src = (char *)src + 1;
}
}
else
{ // 若dst和src 区域交叉,则从尾部开始向起始位置拷贝,这样可以避免数据冲突
dst = (char *)dst + count - 1;
src = (char *)src + count - 1;
while (count--)
{
*(char *)dst = *(char *)src;
dst = (char *)dst - 1;
src = (char *)src - 1;
}
}
return(ret);
}
所以实现的要点就是通过memmove来移动内存。- cocos2d-x,CCArray源码学习
- cocos2d-x 之 CCArray 源码分析
- cocos2d-x CCArray使用方法
- cocos2d-x ccArray 讲解
- cocos2d-x中的CCArray
- cocos2d-x中的CCArray
- 【Cocos2d-x 018】 CCArray
- 【Cocos2d-x】CCArray
- Cocos2d-x学习(二十):cocos2d中的容器CCArray
- Cocos2d-x学习(二十):cocos2d中的容器CCArray
- Cocos2d-x学习(二十):cocos2d中的容器CCArray
- 我的Cocos2d-x学习笔记(十九)CCString、CCArray
- [cocos2d-x] CCArray使用注意
- cocos2d-x CCArray使用注意
- cocos2d-x CCArray使用注意
- Cocos2d-x-API-详解-CCArray
- cocos2d-x的CCArray用法
- [转]cocos2d-x中的CCArray
- 9秒开发者关系负责人沈大海:为开发者提供全方位服务
- 平衡二叉树
- python 读取文件
- JAVA实现实时Process,实时获取输出
- android Fragment
- cocos2d-x,CCArray源码学习
- leetcode 024 —— Swap Nodes in Pairs
- ListView item 不响应的原因
- ORA-27125: unable to create shared memory segment
- oracle连接excel的问题
- java 类型的并发程序 内存设置
- Android常用高级控件之——Fragment
- mybatis模糊查询、区间查询
- Swift学习笔记系列——(6)闭包