background image

得到:
argv:54.5792byte
argv:54.5792byte
从这个结果来看似乎一个数组元素大约占用了 54 个左右的字节。再看看数组在 Zend 里面
的 C 结构,PHP

 

中的数组变量,首先需要一个 zval 结构:

struct _zval_struct {
   zvalue_value value;
   zend_uint refcount__gc;
   zend_uchar type;
   zend_uchar is_ref__gc;
};
zvalue_value 是一个 union:
typedef union _zvalue_value {
   long lval;
   double dval;
   struct {
       char *val;
       int len;
   } str;
   HashTable *ht;
   zend_object_value obj;
} zvalue_value;

 

通常 zval 

 

结构需要 8+6=14 个字节,PHP

 

中每个变量都有对应的 zval,但是数组,字符

 

串和对象还需要另外的存储结构,而数组则是一个 HashTable :
typedef struct _hashtable {
    uint nTableSize;
    uint nTableMask;
    uint nNumOfElements;
    ulong nNextFreeElement;
    Bucket *pInternalPointer;
    Bucket *pListHead;
    Bucket *pListTail;
    Bucket **arBuckets;
    dtor_func_t pDestructor;
    zend_bool persistent;
    unsigned char nApplyCount;
    zend_bool bApplyProtection;
} HashTable;
HashTable 

 

结构需要 40 

 

个字节,每个数组元素存储在 Bucket 结构中:

typedef struct bucket {