在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 在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器的指 令集中,效率很高,但是分配...
核心記憶體的分配
當使用者態程序需要額外記憶體的時候,可以從核心所維護的空閒頁幀鍊錶中獲取頁,該鍊錶通常由頁替換演算法來更新,這些頁幀通常分散在物理記憶體當中,如果使用者只需要乙個位元組的記憶體,那麼會產生記憶體碎片,這是因為程序會得到整個頁幀 核心記憶體的分配通常是從空閒記憶體池中獲取的,而並不是從滿足普通使用者模...