今天碰到乙個關於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是指向的同乙個區域,$b['child']=$a時,$b會先copy乙份原來$a的內容,然後再修改,也就是說這時候$b和$a指向了不同的區域,再修改$a或者$b的時候都不會互相影響了。
再看這段**:
class a
$a = new a();
$b = $a;
$a->str = 1;
$a->child = 2;
$b->child = $a;
$b->child->str = 2;
echo $b->str;
$b = null;
echo $a->str;
又會輸出什麼呢,結果是22,根據實際情況來判斷,$b->child=$a的時候,並沒有像陣列那樣,重新copy乙份,ab以及a->child都是指向的同一片區域,這樣改任何乙個,其餘幾個都會被改掉。
可是php為啥要設計成這樣呢。
變數記憶體分配
預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結構中...
變數記憶體分配
變數記憶體分配 預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注...
變數的記憶體分配
1 從靜態儲存區域分配。內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。例如全域性變數,static變數。2 在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器的指 令集中,效率很高,但是分配...