Best way to clear dynamic array for reuse

Miguel L via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Thu Jul 14 00:07:52 PDT 2016


On Wednesday, 13 July 2016 at 17:19:09 UTC, Steven Schveighoffer 
wrote:
> On 7/13/16 8:41 AM, Lodovico Giaretta wrote:
>> On Wednesday, 13 July 2016 at 12:37:26 UTC, Miguel L wrote:
>>> I tried Appender, but for some reason garbage collector still 
>>> seems to
>>> be running every few iterations.
>>> I will try to expand a little on my code because maybe there 
>>> is
>>> something i am missing:
>>>
>>>  Appender!(A[]) a;
>>>
>>>  void foo( out Appender!(A[]) bar)
>>> {
>>> ...
>>> bar~= lot of elements
>>> }
>>>
>>>  for(....)
>>>  {
>>>  //a=[]; //discard array contents
>>>  a.clear();
>>>  foo(a) appends thousand of elements to a
>>>  ... use a for some calculations
>>>  }
>>
>> Well, I think foo's parameter should be `ref Appender!(A[]) 
>> bar` instead
>> of `out Appender!(A[]) bar`.
>
> Yes, this is why you still have issues. An out parameter is set 
> to its init value upon function entry, so you have lost all 
> your allocation at that point.
>
>> Also, if you know you will append lots of
>> elements, doing a.reserve(s), with s being an estimate of the 
>> number of
>> appends you expect, might be a good idea.
>
> This is true for builtin arrays as well.
>
> -Steve

Ok, i have read about Appender and assumeSafeAppend(), but i am 
still a bit confused.
What i have understood is: dynamic arrays are (almost) always 
reallocating when appending to them except assumeSafeAppend() is 
used, or when wrapping them with Appender. So, if i'm sure there 
are no slices referencing my array i can use assumeSafeAppend(). 
But is this permanent? I mean if I declare:
  array A[] x;
  x.assumeSafeAppend();

Does that last forever so I can append without reallocating after 
emptying array x, or should I call assumeSafeAppend() every time 
I adjust x.length or append to x?

Maybe I should give up trying to use dynamic arrays and use fixed 
length arrays instead.


More information about the Digitalmars-d-learn mailing list