ccArray*系列和ccCArray*系列

这两个系列的区别就是:

ccArray 是包含retain/release的,即ccArray的对象需要是Ref的子类。
ccCArray 则是c风格的动态数组,对数组元素没有要求。

路径

1
2
2d/support/data-support/ccCArray.h
2d/support/data-support/ccCArray.cpp

源码分析

ccArray系列

先看结构体

1
2
3
4
typedef struct _ccArray {
ssize_t num, max;
Ref** arr;
} ccArray;

我看了实现的代码,和std::vector动态数组的实现还是类似的。
这个每次的扩容都是当前容量*2

另外值得注意的一点是,arr是使用calloc申请空间的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ccArray* ccArrayNew(ssize_t capacity)
{

if (capacity == 0)
/* 至于这里为毛是 7 呢?*/
/* 或许程序员写代码的时候正好是 7 号?*/
/* 再或者是 8 - 1 = 7 ?*/
capacity = 7;

ccArray *arr = (ccArray*)malloc( sizeof(ccArray) );
arr->num = 0;

arr->arr = (Ref**)calloc(capacity, sizeof(Ref*));
arr->max = capacity;

return arr;
}

calloc和malloc的区别在于:

  • calloc含有两个参数,数量和单位大小
  • calloc会将申请来的内存清零,而malloc则不会。

ccCArray系列

结构体的不同之处在于arr的类型变成了void**类型。

1
2
3
4
truct _ccCArray {
ssize_t num, max;
void** arr;
} ccCArray;

其他的地方和ccArray系列都差不多。代码也就不贴上来了。

总结

说到std::vector这些乱七八糟的东西,就想到了那本讲stl的书,之前稍微看了一点点,没看完,感觉还是得抽点时间去仔细看看!