background image

    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,小型数组果然是划不来的。