Efficiency of using array as stack

Jonathan M Davis jmdavisProg at gmx.com
Sat Mar 23 12:32:54 PDT 2013


On Saturday, March 23, 2013 13:10:56 Ivan Kazmenko wrote:
> Today, I had trouble using D built-in dynamic array as a stack:
> it timed out badly.  I have then tried to reduce the problem down
> to a minimal example.  I am using DMD 2.062.

You might want to check out this article where someone ran into similar 
issues:

https://www.semitwist.com/articles/article/view/don-t-use-arrays-as-stacks

And if you haven't read Steven's article on arrays, you should do so:

http://dlang.org/d-array-article.html

But basically, you need to either wrap an array and then either

1. Use it as a holder a chunk of pre-allocated chunk of memory for your stack 
rather than the stack itself. You then get something like

void push(T elem)
{
    if(_stackLen == _arr.length)
        _arr ~= elem;
    else
        _arr[stackLen++] = elem;
}

void pop()
{
    ++_stackLen;
}

2. Use the internal array as a stack, and use assumeSafeToAppend when you pop 
an element, but you have to guarantee that there are no other slices to the 
array for that to work, or you'll end up stomping on those other slices.

void push(T elem)
{
    _arr ~= elem;
}

void pop()
{
    --_arr.length;
    assumeSafeAppend(arr);
}

In either case, using an array directly as a staci and simply appending to it 
to push and decrementing its length to pop isn't going to be particularly 
efficient do to how slices work.

- Jonathan M Davis


More information about the Digitalmars-d-learn mailing list