assumeSafeAppend on slice of static array?
Steven Schveighoffer via Digitalmars-d
digitalmars-d at puremagic.com
Tue Apr 22 11:24:41 PDT 2014
On Tue, 22 Apr 2014 14:10:30 -0400, H. S. Teoh via Digitalmars-d
<digitalmars-d at puremagic.com> wrote:
> I'm going through some code and thinking of ways to reduce GC pressure,
> and came across a bit that needed to append some items to an array:
>
> T[] args;
> lex.expect("(");
> args ~= parseSingleItem(lex);
> while (!lex.empty) {
> lex.expect(",");
> args ~= parseSingleItem(lex);
> }
> lex.expect(")");
> return computeResult(args);
>
> Now obviously, in the general case (with arbitrarily many number of
> items) some GC allocations will be needed, but the most common use-cases
> are actually only 1 or 2 items each time. Allocating lots of small
> arrays seem to be rather wasteful, so I thought to use a static array as
> a buffer instead.
>
> The question is, is there a way to take a slice of the static array, set
> the length to zero, and append to it with ~= such that when it runs out
> of space in the static buffer, it will reallocate a longer array on the
> GC heap? Or is this a bad idea?
TL;DR: Yes, use Appender :)
The reason appending even works is because of the metadata stored in the
heap. Obviously, stack frames and fixed-length arrays do not have this
data.
When that metadata cannot be found, it reallocates because that's the only
option.
However, Appender, initialized with a static buffer, knows the length of
its data, and stores its own capacity, separate from the heap.
I'm not sure if it will fit your needs, give it a look.
-Steve
More information about the Digitalmars-d
mailing list