摘要:中的用于類型整型和資源類型用于浮點類型用于字符串用于數(shù)組用于對象用于常量表達式才有多數(shù)文章,在提到變量結(jié)構(gòu)體的時候,都提到,實際上這個論述并不準確,在為時,這個結(jié)果是正確的。主要看中的,是兩個,這個永遠是個字節(jié),所以,因此。
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 類型、整型和資源類型 double dval; // 用于浮點類型 struct { // 用于字符串 char *val; int len; } str; HashTable *ht; // 用于數(shù)組 zend_object_value obj; // 用于對象 zend_ast *ast; // 用于常量表達式(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)體的時候,都提到:sizeof(zval) == 24, sizeof(zvalue_value) == 16,實際上這個論述并不準確,在 CPU 為 64bit 時,這個結(jié)果是正確的。
但當 CPU 為32bit 時: sizeof(zval) == 16, sizeof(zvalue_value) == 8,主要因為 CPU 為 64bit 時,指針占用8個字節(jié),而 32bit時,指針為4個字節(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的看似很多,但其實更簡單了,不論 CPU 是32bit 還是 64bit,sizeof(zval) 永遠都是等于 16。
主要看 zend_value 中的 ww,是兩個 uint32_t,這個永遠是 8 個字節(jié),所以 sizeof(zend_value) == 8,因此 sizeof(zval) == 16。
所以 PHP7 新特性提到的節(jié)省內(nèi)存這點上,在 32bit 系統(tǒng)中,PHP5 => PHP7 并無變化。
順便說下 sizeof,不能當做函數(shù),雖然寫法像函數(shù),這個數(shù)值會在編譯期就確定好,非運行期。類似編譯預處理。
有關sizeof的詳情,可以看:
http://blog.csdn.net/yangtale...
這個CSDN 文章的排版雖然有些亂,但總結(jié)的都是精華,耐心看完,理解透徹后,就很容理解我上面的分析。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/30633.html
摘要:在這種狀況下,雖然也只是規(guī)規(guī)矩矩地完成其缺省行為,可是的確能夠維護你免于大多數(shù)簡略的注入式進犯。年五月號,在登錄代碼中發(fā)現(xiàn)了一處注入軟弱性。因而,它很容易遭受咱們前面所評論的注入類型的進犯。 或許存在許多不同類型的進犯動機,可是乍看上去,好像存在更多的類型。這是十分實在的-假如歹意用戶發(fā)現(xiàn)了一個能夠履行多個查詢的方法的話。假如你的腳本正在履行一個SELECT指令,那么,進犯者能夠逼迫顯...
摘要:在這種狀況下,雖然也只是規(guī)規(guī)矩矩地完成其缺省行為,可是的確能夠維護你免于大多數(shù)簡略的注入式進犯。年五月號,在登錄代碼中發(fā)現(xiàn)了一處注入軟弱性。因而,它很容易遭受咱們前面所評論的注入類型的進犯。 或許存在許多不同類型的進犯動機,可是乍看上去,好像存在更多的類型。這是十分實在的-假如歹意用戶發(fā)現(xiàn)了一個能夠履行多個查詢的方法的話。假如你的腳本正在履行一個SELECT指令,那么,進犯者能夠逼迫顯...
摘要:的四種綁定規(guī)則的種綁定規(guī)則分別是默認綁定隱式綁定顯示綁定綁定。綁定中的操作符,和其他語言中如的機制是不一樣的。規(guī)則例外在顯示綁定中,對于和的綁定將不會生效。它也是作為機制的一種替換,解決之前綁定過程各種規(guī)則帶來的復雜性。 徹底搞懂 JS 中 this 機制 摘要:本文屬于原創(chuàng),歡迎轉(zhuǎn)載,轉(zhuǎn)載請保留出處:https://github.com/jasonGeng88/blog 目錄 t...
摘要:不甘做輪子的搬運工記錄一個實習菜鳥寫圖片預覽組件的艱辛道路很多組件中使用了指令模式和服務模式,比如以下以組件為例指令模式全屏覆蓋服務模式跟大多數(shù)萌新一樣,啥是服務先看看的目錄結(jié)構(gòu)打開目錄,找到其下目錄文件中有一大坨組件注冊信息重點找 不甘做輪子的搬運工?。?! 記錄一個實習菜鳥寫圖片預覽組件的艱辛道路~ elementUI很多組件中使用了指令模式和服務模式,比如:loading、mes...
摘要:設計模式是以面向?qū)ο缶幊虨榛A的,的面向?qū)ο缶幊毯蛡鹘y(tǒng)的的面向?qū)ο缶幊逃行┎顒e,這讓我一開始接觸的時候感到十分痛苦,但是這只能靠自己慢慢積累慢慢思考。想繼續(xù)了解設計模式必須要先搞懂面向?qū)ο缶幊蹋駝t只會讓你自己更痛苦。 JavaScript 中的構(gòu)造函數(shù) 學習總結(jié)。知識只有分享才有存在的意義。 是時候替換你的 for 循環(huán)大法了~ 《小分享》JavaScript中數(shù)組的那些迭代方法~ ...
閱讀 610·2021-11-18 13:12
閱讀 1328·2021-11-15 11:39
閱讀 2489·2021-09-23 11:22
閱讀 6224·2021-09-22 15:15
閱讀 3670·2021-09-02 09:54
閱讀 2322·2019-08-30 11:10
閱讀 3254·2019-08-29 14:13
閱讀 2919·2019-08-29 12:49