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