遇到一個面試題$a = 1; $b=$a; $a=2; 這段代碼的內存是怎樣分配的?
通過我在網上的查詢得到兩種不同的觀點:
1)一種是
$a = 1; 首先給$a分配一個內存 地址一 并且它里面存的值是 1
$b=$a; 將$a的變量容器復制一份,成為一個新的變量容器,$b指向這個容器(在這一步就進行了復制變量容器操作)
$a=2; 這時改變$a的值變成2,就不會影響$b的值了
2)另一種方案就是
$a = 1; 首先給$a分配一個內存 地址一 并且它里面存的值是 1
$b=$a; 將$b的也指向$a的地址一,此時不進行復制變量容器操作
$a=2; 這時需要改變$a的值變成2,這時就需要復制$a 這個變量容器,讓$b指向這個新的變量容器地址。
接下來就是我的驗證方式了,第一種方式:我是從內存變化的角度來說明:
echo 'PHP版本:'.PHP_VERSION."<br>";
echo '初始內存大?。?.memory_get_usage()."<br>";
$a = 1;
echo '執行$a = 1后內存變成:'.memory_get_usage()."<br>";
$b=$a;
$a=2;
echo '執行$a=2后內存變成:'.memory_get_usage()."<br>";
輸出:
PHP版本:7.0.15
初始內存大?。?409416
執行$a = 1后內存變成:6409416
執行$a=2后內存變成:6409416
我發現內存竟然沒有變化,驗證失敗了。
第二種驗證方式:
我用的是php 的debug_zval_dump
我的環境是php7,但是這個函數似乎不支持int類型的數據,
我不得不重新弄一個類似的例子來驗證:
echo PHP_VERSION."<br>";
$a = 'a';
debug_zval_dump($a);
echo "<br>";
$b=$a;
debug_zval_dump($a);
echo "<br>";
$a='a1';
debug_zval_dump($a);
輸出:
7.0.15
string(1) "a" refcount(1)
string(1) "a" refcount(1)
string(2) "a1" refcount(1)
這時問題就來了,為什么refcount值始終是1,難道執行完 $b=$a;不是應該 refcount的值加一嗎
我懷疑是我的php版本問題,我又去php7.1上執行
輸出:
7.1.1
<br>string(1) "a" refcount(1)
<br>string(1) "a" refcount(1)
<br>string(2) "a1" refcount(1)
一樣的結果。
然后我就去看一下php文檔,發現我中文檔中的
我也執行:
echo 'PHP版本:'.PHP_VERSION."<br>";
$var1 = 'Hello World';
debug_zval_dump($var1);
輸出:
PHP版本:7.0.15
string(11) "Hello World" refcount(1)
而文檔的輸出是 refcount值為2
文檔鏈接
我的這一條驗證之路也被堵死了,
請各位大神給我點指導意見,是在是弄不出來了。
$a = 1; $b=$a; $a=2; 這段代碼的內存是怎樣分配的?
慕碼人8056858
2019-03-15 16:34:25