亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

$a = 1; $b=$a; $a=2; 這段代碼的內存是怎樣分配的?

$a = 1; $b=$a; $a=2; 這段代碼的內存是怎樣分配的?

PHP
慕碼人8056858 2019-03-15 16:34:25
遇到一個面試題$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 文檔鏈接 我的這一條驗證之路也被堵死了, 請各位大神給我點指導意見,是在是弄不出來了。
查看完整描述

6 回答

?
米脂

TA貢獻1836條經驗 獲得超3個贊

這個考的主要是copy on write ,php 寫時復制。附上鳥哥and pi的文章,希望對你有用。
深入理解php原理之變量分離

php internal copy on write

查看完整回答
反對 回復 2019-03-18
?
慕桂英546537

TA貢獻1848條經驗 獲得超10個贊

函數 xdebug_debug_zval() 的參數是字符串類型的吧,你是不是參數用錯了!引用計數基本知識

查看完整回答
反對 回復 2019-03-18
?
慕容708150

TA貢獻1831條經驗 獲得超4個贊

php7不再對簡單值進行引用計數

查看完整回答
反對 回復 2019-03-18
  • 6 回答
  • 0 關注
  • 629 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號