length = 0 clears reserve

Jon Degenhardt via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Mon Apr 10 20:00:29 PDT 2017


On Tuesday, 11 April 2017 at 01:59:57 UTC, Jonathan M Davis wrote:
> On Tuesday, April 11, 2017 01:42:32 Jethro via 
> Digitalmars-d-learn wrote:
>> arrays have the ability to reserve but when setting the length 
>> to 0, it removes the reserve!! ;/
>>
>> char[] buf;
>> buf.reserve = 1000;
>> buf.length = 0;
>> assert(buf.capacity == 0);
>>
>> But I simply want to clear the buffer, not change it's 
>> reserve/capacity.
>>
>> I've tried to hack by setting the length to 0 through a 
>> pointer, but that still clears the capacity!
>>
>> I want to do this because I want to be able to reuse the array 
>> without ever reallocating(I'll set the capacity to the max 
>> that will ever be used, I don't have to worry about conflicts 
>> since it will always be ran serially).
>>
>> [snip]
>
> You can't reuse the memory of a dynamic array by simply setting 
> its length to 0. If that were allowed, it would risk allow 
> dynamic arrays to stomp on each others memory (since there is 
> no guarantee that there are no other dynamic arrays referring 
> to the same memory). However, if you know that there are no 
> other dynamic arrays referrin to the same memory, then you can 
> call assumeSafeAppend on the dynamic array, and then the 
> runtime will assume that there are no other dynamic arrays 
> referring to the same memory.
>
> [snip]

Another technique that works for many cases is to use an Appender 
(std.array). Appender supports reserve and clear, the latter 
setting the length to zero without reallocating. A typical use 
case is an algorithm doing a series of appends, then setting the 
length to zero and starts appending again.

--Jon


More information about the Digitalmars-d-learn mailing list