有人可以解释一下,为什么在PHP中创建一个整数,花费72个字节?
var_dump(memory_get_usage()); //49248 bytes
$a = 255;
var_dump(memory_get_usage()); // 49320 bytes
答案 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是一种预处理语言,而不是将代码转换为二进制的程序,然后运行二进制代码。