dynamic array .length vs .reserve - what's the difference?

Christian Köstlin christian.koestlin at gmail.com
Sun Aug 2 09:35:08 UTC 2020


On 31.07.20 06:28, Ali Çehreli wrote:
> On 7/30/20 4:42 PM, wjoe wrote:
> 
>  > So .capacity can't be assigned a value like length to reserve the RAM ?
> 
> Yes, a read-only property...
> 
>  >> auto a = b;
>  >> b = b[0 .. $-1];
>  >> b ~= someT;
>  >>
>  >> If that last line is done in-place, then it overwrites a[$-1].
>  >
>  > So this is a case of sharing being terminated ?
> 
> Yes but the "sharing being terminated" phrase was my attempt at 
> explaining things, which did not catch on. :)
> 
>  > Expired structs are put back into (appended to) the array for reuse.
>  > When the length of the array == 0, upon releasing a struct, this array
>  > is reallocated which isn't supposed to happen. It should just grow like
>  > it did with length > 1.
>  > assumeSafeAppend should accomplish that :)
> 
> Yes, assumeSafeAppend is exactly for cases like that and it helps.
> 
> Another option, which is curiously said to be more performant in memory 
> allocation than native arrays, is std.array.Appender. I've used 
> function-local static Appenders to cut down on memory allocation. Here 
> is an uncompiled pseudo code:
> 
> void foo() {
>    static Appender!int a;
>    a.clear();  // <- Clear state from last execution of this function.
>                //    'a' still holds on to its memory.
> 
>    while (someCondition()) {
>      a ~= 42;
>    }
> 
>    // Use 'a' here
> }
> 
> So, 'a' will have the longest length ever used up to this point, which 
> may be exactly what is desired.
> 
> The cool thing is, because data is thread-local by-default in D, every 
> thread gets their own copy of 'a', so there is not danger of data race. 
> :) (Warning: Don't call foo() recursively though. ;) )
> 
> Ali
> 
That's a trick I need to remember!

Thank Ali!


More information about the Digitalmars-d-learn mailing list