Dynamic array as stack and GC.BlkAttr.APPENDABLE

H. S. Teoh via Digitalmars-d digitalmars-d at puremagic.com
Fri Nov 14 15:05:58 PST 2014


On Sat, Nov 15, 2014 at 02:02:29AM +0300, Dmitry Olshansky via Digitalmars-d wrote:
> 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.
[...]

This smells like it should be a Phobos module. ;-)

No, seriously, I've reimplemented this myself a few times already.
Mostly I've only gotten as far as assumeSafeAppend, but at least one
instance seems to be pushing towards the second/third stage.


T

-- 
Trying to define yourself is like trying to bite your own teeth. -- Alan Watts


More information about the Digitalmars-d mailing list