std.collection lets rename it into std,ridiculous.

Steven Schveighoffer schveiguy at yahoo.com
Fri Feb 24 08:39:10 PST 2012


On Mon, 20 Feb 2012 11:22:32 -0500, a <a at a.com> wrote:

>> auto a = [1,2,3,4,5];
>> auto b = a[0..3];
>> assumeSafeAppend(b);
>> b ~= 0;
>> writeln(a);
>>
>> prints [1, 2, 3, 0, 5], so b is not reallocated in this case.
>
> Just to clarify: this is not guaranteed to print [1, 2, 3, 0, 5], it  
> only does
> if there is still enough memory in a block allocated to b and it doesn't  
> have
> to be reallocated.

In fact, it is guaranteed.  a is guaranteed to be allocated on the heap,  
because that's what an array literal does (currently, but it probably  
shouldn't be).  It's guaranteed to be inserted into a block large enough  
to hold 5 numbers, so you definitely can put 4 numbers (1, 2, 3, 0) into  
it.  This will never reallocate.

However, It's not guaranteed that the last number will be 5 after  
assumeSafeAppend is called.  Once you call assumeSafeAppend, all data  
after that last element is invalid (i.e. not used).  To refer to that data  
is implementation-defined.  E.g. a different version of assumeSafeAppend  
may set all invalid bytes to 0, or some other sentinel value.

-Steve


More information about the Digitalmars-d mailing list