为什么整数值占用72个字节的内存?

时间:2011-09-09 07:40:36

标签: php memory

  

可能重复:
  What is the overhead of using PHP int?

有人可以解释一下,为什么在PHP中创建一个整数,花费72个字节?

var_dump(memory_get_usage()); //49248 bytes  
$a = 255;  
var_dump(memory_get_usage()); // 49320 bytes

3 个答案:

答案 0 :(得分:2)

这可能是由于PHP分配内存的方式。这些文件不会被编译成二进制文件,因此它们不会将四个字节压入堆栈或在堆上分配,而是在虚拟堆栈上分配内存。

答案 1 :(得分:2)

我没有PHP内部的广泛知识,但概念是当你用一个整数值创建一个变量时,PHP在内部分配一个结构(这种结构通常被称为 variants ),能够保存语言中的任何类型的值(包括对象类型,函数等)。这必然需要超过4个字节。

有了这个问题,剩下的问题是为什么72(而不是例如42)?为了得到答案,我们不仅需要检查C源(要查看完全分配的内容及其内存占用量),还需要检查memory_get_usage的实现(以查看它是如何计算内存使用量的。)

更新:我觉得我需要更多地强调“它如何计算内存使用量”。

新变量的分配完全有可能导致PHP的内存分配器从C堆中保留一块内存,大大超过满足变量分配请求所需的内存块(它还可以决定保留这个内存的未来)甚至在您unset变量之后使用。

如果memory_get_usage想要将整个内存块计为“已使用”,那么你甚至可以看到一个简单的整数变量导致使用量上升,比如1K(如果事情就像我描述的那么简单)到目前为止,一个额外的整数分配将导致内存使用量增加。)

我的观点是在完全定义预期结果之前,你无法调用内存使用结果。如果不查看memory_get_usage的来源,这是不可能的。

答案 2 :(得分:0)

设置任何变量都会占用特定数量的内存,因此您可以执行以下操作而不会出现任何错误:

$a = 100;
//...then later in the code
$a = 100000;
//or
$b = "hello";
//...then later in the code
$b = "hello world this is a long string to show how long a string can be.";

也可能是因为PHP是一种预处理语言,而不是将代码转换为二进制的程序,然后运行二进制代码。