Re: Array max size
| From: | Marcos Passos | Date: | Wed, 01 Aug 2018 19:55:45 +0000 |
| Subject: | Re: Array max size | ||
| References: | 1 2 3 4 5 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-103017@lists.php.net to get a copy of this message | ||
If you are arguing strictly about not knowing what to write on the
documentation, let's move the discussion towards whether it should be
defined or not.
2018-08-01 16:51 GMT-03:00 Sherif Ramadan <theanomaly.is@gmail.com>:
> Right, and therein lies the problem. No one has ever defined this
> behavior. As such, one cannot document what has never been defined.
>
> What you're describing is UNdefined. Undefined things cannot be documented.
>
>
> On Wed, Aug 1, 2018, 3:46 PM Marcos Passos <marcospassos.com@gmail.com>
> wrote:
>
>> *The point is not about the possibility of crossing the limit of the
>> array, but the need for a definition so one can design a method or function
>> whose behavior aligns with the array capabilities. This need, in fact,
>> became more noticeable from a design point of view since the introduction
>> of the iterable pseudo-type.
>>
>>
>>
>> 2018-08-01 16:44 GMT-03:00 Marcos Passos <marcospassos.com@gmail.com>:
>>
>>> It looks like the limit I mentioned, used by some functions, is
>>> architecture-dependent:
>>>
>>> https://github.com/php/php-src/blob/master/Zend/zend_types.h#L288
>>>
>>> Also, that's such a ridiculously large number for the vast majority of
>>>> people using PHP that hardly anyone ever runs into this limit.
>>>
>>>
>>> The point is not about the possibility of crossing the limit of the
>>> array, but the need for a definition is one to design a method or function
>>> whose behavior aligns with the array capabilities. This need, in fact,
>>> became more noticeable from a design point of view since the introduction
>>> of the iterable pseudo-type.
>>>
>>> No one ever said "this is what will happen if a PHP array exceeds <this>
>>>> size". Until someone does that, I cannot document it.
>>>
>>>
>>> I cannot disagree more with this statement.
>>>
>>> - Marcos
>>>
>>> 2018-08-01 16:29 GMT-03:00 Sherif Ramadan <theanomaly.is@gmail.com>:
>>>
>>>> It's undocumented, because it's considered undefined behavior. PHP
>>>> arrays implicitly store the number of elements internally as an unsigned 32
>>>> bit integer (regardless of architecture). This means that (technically) you
>>>> can't create an array with more than ((2**31) - 1) elements (or
>>>> 2,147,483,647 elements). However, PHP won't actually attempt to stop you
>>>> from doing this! The problem is, once you exceed these number of elements,
>>>> the integer will overflow, causing undefined behavior (all kinds weird
>>>> bugs). So we cannot document behavior that was never defined. No one ever
>>>> said "this is what will happen if a PHP array exceeds <this> size".
>>>> Until
>>>> someone does that, I cannot document it. Also, that's such a ridiculously
>>>> large number for the vast majority of people using PHP that hardly anyone
>>>> ever runs into this limit.
>>>>
>>>>
>>>>
>>>>
>>>> On Wed, Aug 1, 2018 at 2:42 PM Marcos Passos <
>>>> marcospassos.com@gmail.com> wrote:
>>>>
>>>>> Whenever you look for more information about the maximum size of an
>>>>> array,
>>>>> you find someone saying that "PHP arrays do not have a maximum size,
>>>>> but
>>>>> the amount of memory available". However, I could not find any excerpt
>>>>> in
>>>>> PHP documentation that supports that.
>>>>>
>>>>> Even if the engine imposes no hard limit on the size of an array, in
>>>>> fact,
>>>>> there an inherent limit that is assumed by some functions, and that is
>>>>> what
>>>>> I would like to suggest making explicit on the documentation. The lack
>>>>> of
>>>>> this definition leads to inconsistencies and leaves several open
>>>>> questions,
>>>>> including:
>>>>>
>>>>> - If no limit exists, then it's conceptually possible to have an
>>>>> array
>>>>> with *PHP_INT_MAX + 1* elements. In that sense, what would be the
>>>>> return
>>>>> of the *\count()*?
>>>>> - The function *range* validates the size of the resulting range
>>>>> against
>>>>> the maximum size of the hash table (defined internally as
>>>>> *HT_MAX_SIZE*),
>>>>> and throw an error if it exceeds that value. Is that the limit?
>>>>> - he function *array_fill*, in contrast, does not rely on
>>>>> *HT_MAX_SIZE*
>>>>> for validating the size of the result. But, why?
>>>>> - The documentation says that omitting the third parameter of
>>>>> array_split is equivalent to \count($array). If the maximum number
>>>>> representable in PHP is *PHP_INT_MAX*, is the max size the same as
>>>>> *PHP_INT_MAX*?
>>>>>
>>>>> There are other examples, but I think these are enough to make the
>>>>> point.
>>>>>
>>>>> My understanding is that the conceptual limit is *PHP_INT_MAX*, as
>>>>> there is
>>>>> no way to represent the size above this value. If so, the interval that
>>>>> represents all possibles indexes for an array is defined as *0 <=
>>>>> index <=
>>>>> PHP_INT_MAX -1*. That definition aligns with all functions that support
>>>>> negative length as *-PHP_INT_MAX* is equivalent to the start of the
>>>>> array.
>>>>>
>>>>> Could you guys please share your thoughts on this topic?
>>>>>
>>>>
>>>
>>