Dynamic array as stack and GC.BlkAttr.APPENDABLE

Dmitry Olshansky via Digitalmars-d digitalmars-d at puremagic.com
Fri Nov 14 15:02:29 PST 2014


15-Nov-2014 01:38, Steven Schveighoffer пишет:
> On 11/14/14 5:25 PM, Dmitry Olshansky wrote:
>> 15-Nov-2014 01:16, IgorStepanov пишет:
>>> Recently I encountered the following problem.
>>> I need a simple stack of uint.
>>> I want to push uints back and pop it. I don't want to copy this stack
>>> and I want it to work fast.
>>>
>>> In a first approximation, the problem seems easy.
>>>
>>> uint[] my_stack;
>>> my_stack.reserve(256);
>>>
>>> my_stack ~= 1; //push
>>> uint head = my_stack[$ - 1]; //top
>>> my_stack.length--; //pop
>>
>> Just make push into:
>>
>> my_stack.assumeSafeAppend();
>> my_stack ~= value;
>>
>> To avoid relocations.
>>
>
> In actuality, you do not need this before every push. You only need it
> between a pop and a push.
>
> I highly recommend not doing arrays-as-stacks, because you end up
> writing your own type.

+1

> At that point, you may as well remove the funky
> array/slice semantics, and store the capacity yourself.
>

That's the second approximation ;)
The third goes to C's malloc.
The 4-th starts with some small array on stack, then goes to C's malloc.


-- 
Dmitry Olshansky


More information about the Digitalmars-d mailing list