assumeSafeAppend on slice of static array?
monarch_dodra via Digitalmars-d
digitalmars-d at puremagic.com
Tue Apr 22 11:59:05 PDT 2014
On Tuesday, 22 April 2014 at 18:47:16 UTC, Dmitry Olshansky wrote:
> 22-Apr-2014 22:10, H. S. Teoh via Digitalmars-d пишет:
>> 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?
>>
>
> Should be a canonical use case for ScopeBuffer
> https://github.com/D-Programming-Language/phobos/blob/master/std/internal/scopebuffer.d
>
> Except that it has crippled usability e.g. you need to call
> free manually.
I've been working on a "ScopedAppender" that is *bit* slower than
ScopeBuffer, but can be used on any generic types, and is
nothrow/ctfe/pure/"sometimes safe". I'm giving it the "finishing
touches".
But in the meantime, normal appender+clear can work:
int[50] buf;
auto app = appender(buf[]);
app.clear();
//app is ready for use.
The "issue" though is that appender itself as a reference type,
so just declaring it allocates, which kind of gets in the way of
setting up a local scratch space to begin with.
More information about the Digitalmars-d
mailing list