在PHP代码“$ = & # 39;一个# 39;;b =一美元;“分配2个单元或1个单元的内存


In PHP, for the code "$a='a';$b=$a;" allocates 2 units of memory or one unit?

因为$a='a'分配了一个字节,而$b没有被修改。

在PHP中,对于代码"$a='a';$b=$a;"分配2个单位的内存还是1个单位?我如何测试它?

我可以说,伪喜欢

alphahandler = new stringObj
alphahandler->insertContent('a');
variable a = alphahandler.objectHandler();

来到b

variable b = a.getCurrentObjectHandler() 

或者就像

b=a.getCurrentObject().toContent()

? ?

关于测试,您可以使用memory_get_usage();作为近似。

参见:

  • memory_get_usage
  • 可视化分析PHP应用程序内存使用情况的工具
  • 跟踪PHP的内存使用情况

内存分配了多少次?

$a='a';   # creates a new string value, and assigns it to $a
$b=$a;    # assigns the SAME string value -- the one now in $a -- to $b
忽略这两个变量也占用内存(并且需要单独的变量条目),从上面的代码中只创建了一个字符串对象。

也就是说,两个变量现在指向相同的值:赋值时没有创建字符串的"复制"。

分配了多少内存?

有更多的内存被分配(比如,1或2字节):一个是对象的内存,然后是每个变量的内存

虽然这个问题与整数有关,但对于字符串也会发生类似的事情(实际上,发生的事情更多)。一个简单整数至少占用

72字节的内存。正如mario在评论中建议的那样,这个例子可能需要400字节以上。

快乐编码。

简短的回答是另一个答案的链接,但我认为它会证明是有用的,因为这是一个复杂的问题。由于PHP 的工作方式而看起来合乎逻辑的可能实际上并不是核心实现将如何管理内存。

[编辑]一个简单的脚本来说明内部。

字符串在PHP中不是对象——对象的行为与标量变量完全不同。如果你在问关于字符串变量类型的问题,下面的脚本应该能让你对它的内部机制有所了解。

<?php
header( 'content-type: text/plain' );
$a = 'a';
$b = $a;
echo '$b: ';  debug_zval_dump( $b );
$b = 'b';
echo '$a: '; debug_zval_dump( $a );
echo '$a: '; debug_zval_dump( $b );

$b: string(1) "a" refcount(3)
$a: string(1) "a" refcount(2)
$a: string(1) "b" refcount(2)

[edit] -另一个内存使用说明

<?php
header( 'content-type: text/plain' );
$start = memory_get_usage();
echo 'Mem: ' . ( memory_get_usage() - $start ) . PHP_EOL; $start = memory_get_usage();
$a = 'a';
echo 'Mem: ' . ( memory_get_usage() - $start ) . PHP_EOL; $start = memory_get_usage();
$b = $a;
echo 'Mem: ' . ( memory_get_usage() - $start ) . PHP_EOL; $start = memory_get_usage();

echo '$b: ';  debug_zval_dump( $b );
$b = 'b';
echo 'Mem: ' . ( memory_get_usage() - $start ) . PHP_EOL; $start = memory_get_usage();
echo '$a: '; debug_zval_dump( $a );
echo 'Mem: ' . ( memory_get_usage() - $start ) . PHP_EOL; $start = memory_get_usage();
echo '$a: '; debug_zval_dump( $b );
echo 'Mem: ' . ( memory_get_usage() - $start ) . PHP_EOL; $start = memory_get_usage();

Mem: 76
Mem: 88
Mem: 48
$b: string(1) "a" refcount(3)
Mem: 40
$a: string(1) "a" refcount(2)
Mem: 0
$a: string(1) "b" refcount(2)
Mem: 0