PHP5 中的 zval
// 1. zval
typedef struct _zval_struct {
zvalue_value value;
zend_uint refcount__gc;
zend_uchar type;
zend_uchar is_ref__gc;
} zval;
// 2. zvalue_value
typedef union _zvalue_value {
long lval; // 用于 bool 類(lèi)型、整型和資源類(lèi)型
double dval; // 用于浮點(diǎn)類(lèi)型
struct { // 用于字符串
char *val;
int len;
} str;
HashTable *ht; // 用于數(shù)組
zend_object_value obj; // 用于對(duì)象
zend_ast *ast; // 用于常量表達(dá)式(PHP5.6 才有)
} zvalue_value;
// 3. zend_object_value
typedef struct _zend_object_value {
zend_object_handle handle;
const zend_object_handlers *handlers;
} zend_object_value;
// 4. zend_object_handle
typedef unsigned int zend_object_handle;
多數(shù)文章,在提到PHP5 變量結(jié)構(gòu)體的時(shí)候,都提到:sizeof(zval) == 24, sizeof(zvalue_value) == 16,實(shí)際上這個(gè)論述并不準(zhǔn)確,在 CPU 為 64bit 時(shí),這個(gè)結(jié)果是正確的。
但當(dāng) CPU 為32bit 時(shí): sizeof(zval) == 16, sizeof(zvalue_value) == 8,主要因?yàn)?CPU 為 64bit 時(shí),指針占用8個(gè)字節(jié),而 32bit時(shí),指針為4個(gè)字節(jié)。
PHP 7 中的 zval
// 1. zval
struct _zval_struct {
zend_value value; /* value */
union {
struct {
ZEND_ENDIAN_LOHI_4(
zend_uchar type, /* active type */
zend_uchar type_flags,
zend_uchar const_flags,
zend_uchar reserved) /* call info for EX(This) */
} v;
uint32_t type_info;
} u1;
union {
uint32_t next; /* hash collision chain */
uint32_t cache_slot; /* literal cache slot */
uint32_t lineno; /* line number (for ast nodes) */
uint32_t num_args; /* arguments number for EX(This) */
uint32_t fe_pos; /* foreach position */
uint32_t fe_iter_idx; /* foreach iterator index */
uint32_t access_flags; /* class constant access flags */
uint32_t property_guard; /* single property guard */
} u2;
};
// 2. zend_value
typedef union _zend_value {
zend_long lval; /* long value */
double dval; /* double value */
zend_refcounted *counted;
zend_string *str;
zend_array *arr;
zend_object *obj;
zend_resource *res;
zend_reference *ref;
zend_ast_ref *ast;
zval *zv;
void *ptr;
zend_class_entry *ce;
zend_function *func;
struct {
uint32_t w1;
uint32_t w2;
} ww;
} zend_value;
PHP 7的看似很多,但其實(shí)更簡(jiǎn)單了,不論 CPU 是32bit 還是 64bit,sizeof(zval) 永遠(yuǎn)都是等于 16。
主要看 zend_value 中的 ww,是兩個(gè) uint32_t,這個(gè)永遠(yuǎn)是 8 個(gè)字節(jié),所以 sizeof(zend_value) == 8,因此 sizeof(zval) == 16。
所以 PHP7 新特性提到的節(jié)省內(nèi)存這點(diǎn)上,在 32bit 系統(tǒng)中,PHP5 => PHP7 并無(wú)變化。
順便說(shuō)下 sizeof,不能當(dāng)做函數(shù),雖然寫(xiě)法像函數(shù),這個(gè)數(shù)值會(huì)在編譯期就確定好,非運(yùn)行期。類(lèi)似編譯預(yù)處理。
總結(jié)
以上所述是小編給大家介紹的PHP 變量結(jié)構(gòu)體,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
您可能感興趣的文章:- C語(yǔ)言結(jié)構(gòu)體數(shù)組同時(shí)賦值的另類(lèi)用法
- 解析C語(yǔ)言結(jié)構(gòu)體及位段
- 深度剖析C語(yǔ)言結(jié)構(gòu)體
- C語(yǔ)言中結(jié)構(gòu)體變量私有化詳解
- C語(yǔ)言使用結(jié)構(gòu)體實(shí)現(xiàn)簡(jiǎn)單通訊錄
- C語(yǔ)言利用結(jié)構(gòu)體數(shù)組實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng)
- C語(yǔ)言結(jié)構(gòu)體定義的方法匯總
- C++結(jié)構(gòu)體struct和類(lèi)class區(qū)別詳解
- C#中結(jié)構(gòu)體定義并轉(zhuǎn)換字節(jié)數(shù)組詳解
- C++中對(duì)C語(yǔ)言結(jié)構(gòu)體用法的擴(kuò)充