国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > PHP > 正文

徹底搞懂PHP 變量結構體

2024-05-05 00:00:26
字體:
來源:轉載
供稿:網友

PHP5 中的 zval

// 1. zvaltypedef struct _zval_struct { zvalue_value value; zend_uint refcount__gc; zend_uchar type; zend_uchar is_ref__gc;} zval;// 2. zvalue_valuetypedef union _zvalue_value { long lval;  // 用于 bool 類型、整型和資源類型 double dval; // 用于浮點類型 struct {  // 用于字符串  char *val;  int len; } str; HashTable *ht; // 用于數組 zend_object_value obj; // 用于對象 zend_ast *ast; // 用于常量表達式(PHP5.6 才有)} zvalue_value;// 3. zend_object_valuetypedef struct _zend_object_value { zend_object_handle handle; const zend_object_handlers *handlers;} zend_object_value;// 4. zend_object_handletypedef unsigned int zend_object_handle;

多數文章,在提到PHP5 變量結構體的時候,都提到:sizeof(zval) == 24, sizeof(zvalue_value) == 16,實際上這個論述并不準確,在 CPU 為 64bit 時,這個結果是正確的。

但當 CPU 為32bit 時: sizeof(zval) == 16, sizeof(zvalue_value) == 8,主要因為 CPU 為 64bit 時,指針占用8個字節(jié),而 32bit時,指針為4個字節(jié)。

PHP 7 中的 zval

// 1. zvalstruct _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_valuetypedef 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的看似很多,但其實更簡單了,不論 CPU 是32bit 還是 64bit,sizeof(zval) 永遠都是等于 16。
主要看 zend_value 中的 ww,是兩個 uint32_t,這個永遠是 8 個字節(jié),所以 sizeof(zend_value) == 8,因此 sizeof(zval) == 16。

所以 PHP7 新特性提到的節(jié)省內存這點上,在 32bit 系統中,PHP5 => PHP7 并無變化。

順便說下 sizeof,不能當做函數,雖然寫法像函數,這個數值會在編譯期就確定好,非運行期。類似編譯預處理。

總結

以上所述是小編給大家介紹的PHP 變量結構體,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VeVb武林網網站的支持!


注:相關教程知識閱讀請移步到PHP教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 三台县| 台山市| 舟曲县| 高阳县| 恩平市| 天镇县| 东乡族自治县| 辛集市| 龙泉市| 亳州市| 治县。| 邵阳市| 三明市| 玛纳斯县| 洞头县| 潞城市| 饶平县| 望江县| 东港市| 绥江县| 大同县| 青冈县| 广安市| 比如县| 湖口县| 聊城市| 南昌县| 科技| 台南市| 承德市| 福泉市| 原阳县| 瓦房店市| 日土县| 黄浦区| 虞城县| 买车| 衡水市| 宁蒗| 乌苏市| 会宁县|