内存中是不是存在空索引

Posted

技术标签:

【中文标题】内存中是不是存在空索引【英文标题】:Does Empty indexes exists in memory内存中是否存在空索引 【发布时间】:2015-09-09 00:47:55 【问题描述】:

我创建了一个类似的数组

arr[15] = "hello";
arr[21] = "world";

0141520 有空索引。这些空索引是否存储在内存中。它们会导致内存消耗吗?可以为数组设置随机索引吗?谢谢

【问题讨论】:

从哪里创建空索引? 除非你指定$arr[14]=0; 它们不存在,所以不要消耗内存。 “索引”只是一个指向位置的指针 - 这并不意味着它之前的每个位置都必须存在:) 很容易用 if(isset(arr[10])) .. blabla 检查 this answer - 尽管上下文不同,但它很好地解释了数组结构(php 7 之前) 【参考方案1】:

这里是从 0 到 14 和 15 到 20 的空索引。这些空索引是否存储在内存中。它们是否会导致内存消耗

如果你创建了一个包含这些键的数组,那么是的,它们会占用内存

如果您创建 array

$array = array();
var_dump(isset($array));//bool(true)

那么它也会消耗内存。因此,如果您的数组包含空值,那么它也会消耗内存

Null 将被强制转换为空字符串,即键 null 将实际存储在 "" 下。

Check Docs

【讨论】:

投反对票的原因 你说不存在的键占用内存,这是完全错误的。 不,@deceze 我不是这么说的,但是当我读到我的答案时,我明白了为什么我被否决了 我认为 OP 的措辞有点误导。我认为“空”是指不存在,即那些键从未创建。以 “是” 开头的答案仍然很容易被误解。 是的,你是对的 OP 的措辞有点误导。这就是为什么我指定 是的,如果您创建了一个包含这些键的数组,它们将占用内存【参考方案2】:

PHP 数组是关联的,也称为字典,也称为哈希图,也称为键值存储。密钥之间没有关系,这意味着密钥15 的存在并不意味着密钥14 的存在,正如密钥'foo' 的存在并不意味着密钥'bar' 的存在一样。因此 PHP 数组都是 sparse。当您创建密钥 15 时,PHP 确实填充密钥 0-14。它们不存在也不占用内存。

【讨论】:

以上是关于内存中是不是存在空索引的主要内容,如果未能解决你的问题,请参考以下文章

从创建索引过程中内存变化来看SQL Server与MySQL的内存淘汰算法

记一次java内存溢出的解决过程

C#内存管理与垃圾回收

越界异常和空指针异常

Java基础5---数组

使用空指针是不是意味着某些内存始终未被使用?