得到:
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 {