Dynamic array as stack and GC.BlkAttr.APPENDABLE

IgorStepanov via Digitalmars-d digitalmars-d at puremagic.com
Fri Nov 14 15:23:17 PST 2014


On Friday, 14 November 2014 at 23:12:05 UTC, IgorStepanov wrote:
> On Friday, 14 November 2014 at 22:38:53 UTC, Steven 
> Schveighoffer wrote:
>> 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.
> I'm working on AssociativeArray implementation and I need to 
> array which contains indices of free entries (entries is an 
> array which contain Entry objects. When we need to find empty 
> Entry to add a new value to the AA, we are getting the first 
> element of the stack. (If the stack is empty, we need to add 
> new element to entries). If entry has been removed from AA, it 
> index is added to the stack).
>
> Thus I don't want to add extra fields, and this stack is an 
> encapsulated entity.

And if we talk about AA:
What does the NO_INTERIOR flag? Why the table (buckets array) is 
allocated with GC.calloc and NO_INTERIOR flag instead of new 
Entry[size];


More information about the Digitalmars-d mailing list