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

2021-09-02 21:09:39 字數 1348 閱讀 1326

// 1. zval

typedef struct _zval_struct zval;

// 2. zvalue_value

typedef union _zvalue_value 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_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個位元組。

// 1. zval

struct _zval_struct v;

uint32_t type_info;

} u1;

union u2;

};// 2. zend_value

typedef union _zend_value 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的詳情,可以看:

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

**:

徹底搞懂SSD網路結構

還是得從下圖說起,之前一直沒實際搞清楚。ssd的網路結構流程如下圖所示 ssd總共11個block,相比較於之前的vgg16,改變了第5個block的第4層,第6 7 8卷積層全部去掉,分別增加了紅框 黑框 黃框 藍框。tensorflow 如下 with tf.variable scope sco...

結構體型別 結構體變數 結構體陣列 結構體指標

問題1 一元錢換為1 2 5分的硬幣,有多少種兌換方?本題要點分析及參 對各種可能情況進行一一測試。這是實現迴圈的一種方式 窮舉法 但實際上只有只有餘額才能兌換成其它面值的硬幣 main 注意換行的控制和每列的對齊 問題3 某鐵路線上有10個站,需要準備多少種客票?main b a 0 p prin...

和結構體 結構體型別與結構體變數

結構體 struct 是由一系列具有相同型別或不同型別的資料構成的資料集合,叫做結構體。在c語言中,結構體 struct 指的是一種資料結構,是c語言中聚合資料型別 aggregate data type 的一類。結構體可以被宣告為變數 指標或陣列等,用以實現較複雜的資料結構。結構體同時也是一些元素...