ulong h;
uint nKeyLength;
void *pData;
void *pDataPtr;
struct bucket *pListNext;
struct bucket *pListLast;
struct bucket *pNext;
struct bucket *pLast;
char arKey[1];
} Bucket;
Bucket
结构需要 36
个字节,键长超过四个字节的部分附加在 Bucket 后面,而元素值很
可能是一个 zval
结构,另外每个数组会分配一个由 arBuckets
指向的 Bucket 指针数组,
虽然不能说每增加一个元素就需要一个指针,但是实际情况可能更糟。这么算来一个数组
元素就会占用 54 个字节,与上面的估算几乎一样。
一个空数组至少会占用 14(zval) + 40(HashTable) + 32(arBuckets) = 86 个字节,作为一个
变量应该在符号表中有个位置,也是一个数组元素,因此一个空数组变量需要 118 个字
节来描述和存储。从空间的角度来看,小型数组平均代价较大,当然一个脚本中不会充斥
数量很大的小型数组,可以以较小的空间代价来获取编程上的快捷。但如果将数组当作容
器来使用就是另一番景象了,实际应用经常会遇到多维数组,而且元素居多。比如 10k 个
元素的一维数组大概消耗 540k 内存,而 10k x 10
的二维数组理论上只需要 6M 左右的空
间,但是按照 memory_get_usage 的结果则两倍于此,[10k,5,2]的三维数组居然消耗了
23M,小型数组果然是划不来的。