【问题标题】:What's the behavior of count when array has more than 2147483647 elements?当数组有超过 2147483647 个元素时,count 的行为是什么?
【发布时间】:2013-07-28 12:32:51
【问题描述】:

在 32 位系统上,一个数组可以有多达 4294967295 个元素(根据另一个线程上的 Artefacto's post)。

但是,countint 形式返回元素的数量,在 32 位系统上,一个 int 最多为 2147483647。

当数组的元素超过 2147483647 个时,count 会返回什么?

【问题讨论】:

  • 你有没有 200 TB 内存的电脑?
  • 实际上,我认为在 32 位系统上由于地址空间不足,它不可能有那么多元素,即使底层 C 结构的 size 字段可以容纳那么大的值。
  • @mario,这不是重点。
  • @mario 另外,你是怎么达到 200 TiB 的?这将是每个元素 51,2 KiB,这对于许多类型的记录来说有点过多。

标签: php arrays php-internals


【解决方案1】:

首先,根据array element 的大小,您至少需要 163 GiB(32 位)或 309 GiB(64 位)内存才能观察到此行为。

count()的返回值是基于zend_hash_num_elements()

ZEND_API int zend_hash_num_elements(const HashTable *ht)

这个返回值在返回到你的代码之前被转换成long;这会导致count() 返回一个看似负的值。这可以通过将其强制恢复为无符号值来解决:

$c = count($array_with_pow_2_32_elements);
echo $c; // -2147483648
printf("%u\n", $c); // 2147483648

或者:

$c = sprintf('%u', $c);
echo $c; // 2147483648

【讨论】:

    猜你喜欢
    • 2018-02-20
    • 2013-09-30
    • 2018-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-12
    相关资源
    最近更新 更多