遇到一个面试题$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
初始内存大小:6409416
执行$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 回答
- 6 回答
- 0 关注
- 590 浏览
添加回答
举报
0/150
提交
取消