php核心為變數的值分配記憶體的幾個巨集

2022-03-10 22:13:46 字數 894 閱讀 9145

在php5.3之前,為某變數分配記憶體是用巨集 make_std_zval;

737 #define make_std_zval(zv) \   # /zend/zend.h

738 alloc_zval(zv); \

739 init_pzval(zv);

165 #define alloc_zval(z) \      # /zend/zend_alloc.h

166 (z) = (zval *) emalloc(sizeof(zval))

727 #define init_pzval(z) \              # /zend/zend.h

728 (z)->refcount__gc = 1; \

729 (z)->is_ref__gc = 0;

php5.3以及php5.4之後 還是用巨集 make_std_zval; 但是  alloc_zval 裡面有了新的實現,是因為php5.3新的gc(垃圾**機制)

#undef 是在後面取消以前定義的巨集定義

/* the following macroses override macroses from zend_alloc.h */

203 #undef alloc_zval

204 #define alloc_zval(z) \

205 do while (0)

63 #define gc_zval_init(z) \

64 ((zval_gc_info*)(z))->u.buffered = null

至於為什麼這樣做,在 php5.3新的垃圾**機制詳解 中有詳細的介紹

PHP變數記憶體分配問題

今天碰到乙個關於php變數記憶體分配的問題,記錄一下。如下這段 a array str 1,child 2 b a b child a b child str 2 echo b str b null echo a str 會輸出什麼呢,結果是11,b a的時候其實並沒有新分配記憶體,ab是指向的同乙...

變數的記憶體分配

1 從靜態儲存區域分配。內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。例如全域性變數,static變數。2 在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器的指 令集中,效率很高,但是分配...

核心記憶體的分配

當使用者態程序需要額外記憶體的時候,可以從核心所維護的空閒頁幀鍊錶中獲取頁,該鍊錶通常由頁替換演算法來更新,這些頁幀通常分散在物理記憶體當中,如果使用者只需要乙個位元組的記憶體,那麼會產生記憶體碎片,這是因為程序會得到整個頁幀 核心記憶體的分配通常是從空閒記憶體池中獲取的,而並不是從滿足普通使用者模...