国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

徹底搞懂 PHP 變量結構體,多數文章觀點不準確

mtunique / 2895人閱讀

摘要:中的用于類型整型和資源類型用于浮點類型用于字符串用于數組用于對象用于常量表達式才有多數文章,在提到變量結構體的時候,都提到,實際上這個論述并不準確,在為時,這個結果是正確的。主要看中的,是兩個,這個永遠是個字節,所以,因此。

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;    // 用于數組
    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;

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

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

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 個字節,所以 sizeof(zend_value) == 8,因此 sizeof(zval) == 16。

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

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

有關sizeof的詳情,可以看:
http://blog.csdn.net/yangtale...

這個CSDN 文章的排版雖然有些亂,但總結的都是精華,耐心看完,理解透徹后,就很容理解我上面的分析。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/30633.html

相關文章

  • PHP中全面阻撓SQL注入式進犯

    摘要:在這種狀況下,雖然也只是規規矩矩地完成其缺省行為,可是的確能夠維護你免于大多數簡略的注入式進犯。年五月號,在登錄代碼中發現了一處注入軟弱性。因而,它很容易遭受咱們前面所評論的注入類型的進犯。 或許存在許多不同類型的進犯動機,可是乍看上去,好像存在更多的類型。這是十分實在的-假如歹意用戶發現了一個能夠履行多個查詢的方法的話。假如你的腳本正在履行一個SELECT指令,那么,進犯者能夠逼迫顯...

    lakeside 評論0 收藏0
  • PHP中全面阻撓SQL注入式進犯

    摘要:在這種狀況下,雖然也只是規規矩矩地完成其缺省行為,可是的確能夠維護你免于大多數簡略的注入式進犯。年五月號,在登錄代碼中發現了一處注入軟弱性。因而,它很容易遭受咱們前面所評論的注入類型的進犯。 或許存在許多不同類型的進犯動機,可是乍看上去,好像存在更多的類型。這是十分實在的-假如歹意用戶發現了一個能夠履行多個查詢的方法的話。假如你的腳本正在履行一個SELECT指令,那么,進犯者能夠逼迫顯...

    zhkai 評論0 收藏0
  • 徹底搞懂 JS 中 this 機制

    摘要:的四種綁定規則的種綁定規則分別是默認綁定隱式綁定顯示綁定綁定。綁定中的操作符,和其他語言中如的機制是不一樣的。規則例外在顯示綁定中,對于和的綁定將不會生效。它也是作為機制的一種替換,解決之前綁定過程各種規則帶來的復雜性。 徹底搞懂 JS 中 this 機制 摘要:本文屬于原創,歡迎轉載,轉載請保留出處:https://github.com/jasonGeng88/blog 目錄 t...

    李世贊 評論0 收藏0
  • 徹底搞懂elementUI指令與服務模式原理

    摘要:不甘做輪子的搬運工記錄一個實習菜鳥寫圖片預覽組件的艱辛道路很多組件中使用了指令模式和服務模式,比如以下以組件為例指令模式全屏覆蓋服務模式跟大多數萌新一樣,啥是服務先看看的目錄結構打開目錄,找到其下目錄文件中有一大坨組件注冊信息重點找 不甘做輪子的搬運工!!! 記錄一個實習菜鳥寫圖片預覽組件的艱辛道路~ elementUI很多組件中使用了指令模式和服務模式,比如:loading、mes...

    freewolf 評論0 收藏0
  • JS程序

    摘要:設計模式是以面向對象編程為基礎的,的面向對象編程和傳統的的面向對象編程有些差別,這讓我一開始接觸的時候感到十分痛苦,但是這只能靠自己慢慢積累慢慢思考。想繼續了解設計模式必須要先搞懂面向對象編程,否則只會讓你自己更痛苦。 JavaScript 中的構造函數 學習總結。知識只有分享才有存在的意義。 是時候替換你的 for 循環大法了~ 《小分享》JavaScript中數組的那些迭代方法~ ...

    melody_lql 評論0 收藏0

發表評論

0條評論

mtunique

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<