Is it bad practice to alter dynamic arrays that have references to them?
Steven Schveighoffer
schveiguy at yahoo.com
Thu Aug 5 12:58:05 PDT 2010
On Thu, 05 Aug 2010 15:23:13 -0400, simendsjo <simen.endsjo at pandavre.com>
wrote:
> On 05.08.2010 20:50, Steven Schveighoffer wrote:
>> On Thu, 05 Aug 2010 14:41:12 -0400, simendsjo
>> <simen.endsjo at pandavre.com> wrote:
>>
>>> On 05.08.2010 19:35, Steven Schveighoffer wrote:
>>>> On Thu, 05 Aug 2010 13:10:44 -0400, simendsjo
>>>> <simen.endsjo at pandavre.com> wrote:
>>> (...)
>>>>
> (...)
>>> Ah, that's really good to know! So I can see if it will reallocate
>>> using
>>> bool willReallocate = array.capacity < (array.length +
>>> numberOfItemsToAppend)
>>> ?
>>
>> Yes, except the condition should be <=. And that function is
>> implementation independent (the value returned isn't, but it's
>> guaranteed that willReallocate should reflect whether the runtime will
>> reallocate)
>>
> bool willReallocate(T)(T[] array, T[] toAppend) {
> return array.capacity < (array.length + toAppend.length);
> }
>
> int[] a = [0];
> auto aOldPtr = a.ptr;
> assert(a.capacity == 3);
>
> // a.length == a.capacity, so no reallocation
> int[] b = [1,2];
> assert(!willReallocate(a, b));
> a ~= b;
> assert(a.ptr == aOldPtr);
>
> // c.length == 0, so still no
> int[] c;
> assert(!willReallocate(a, c));
> a ~= c;
> assert(a.ptr == aOldPtr);
>
> // there, a.length > a.capacity and reallocation
> int[] d = [3];
> assert(willReallocate(a, d));
> a ~= d;
> assert(a.ptr != aOldPtr);
Oh right, for some reason, my brain did a fantastic translation of your
statement to:
bool willNOTReallocate = array.length + numberOfItemsToAppend <
array.capacity;
Which I then pointed out should really be <=
Sorry :)
-Steve
More information about the Digitalmars-d-learn
mailing list