Stack allocation of dynamic arrays?

Robert Fraser fraserofthenight at gmail.com
Thu Aug 9 19:02:19 PDT 2007


Sean Kelly Wrote:

> Kirk McDonald wrote:
> > Robert Fraser wrote:
> >> I know that by using "scope" you can allocate a class on the stack 
> >> rather than the heap. For this line:
> >>
> >> scope int[] arr = new int[5000];
> >>
> >> ... is arr allocated on the heap or on the stack?
> > 
> > The spec implies it should be on the stack:
> > 
> > "If a NewExpression is used as an initializer for a function local 
> > variable with scope storage class, and the ArgumentList to new is empty, 
> > then the instance is allocated on the stack rather than the heap or 
> > using the class specific allocator."
> > 
> > Even if it isn't actually on the stack, it behaves exactly as though it 
> > were.
> 
> I think this is what should happen according to the spec, but I'm not 
> sure that it's what actually happens in practice.  I tried running this app:
> 
>      char[] pstr;
> 
>      void go()
>      {
>          scope char[] lstr = new char[5];
>          lstr[] = "hello";
>          pstr = lstr;
>      }
> 
>      void main()
>      {
>          go();
>          printf( "%.*s\n", pstr );
>      }
> 
> and it printed "hello".  So to investigate what was actually happening I 
>   dumped the asm code for go():
> 
>      _D4test2goFZv	comdat
>      	assume	CS:_D4test2goFZv
>      L0:		enter	8,0
>      		push	5
>      		push	offset FLAT:_D11TypeInfo_Aa6__initZ
>      		call	near ptr __d_newarrayiT
>      		mov	-8[EBP],EAX
>      		mov	-4[EBP],EDX
>      		push	EDX
>      		push	EAX
>      		push	dword ptr FLAT:_DATA[0Ch]
>      		push	dword ptr FLAT:_DATA[08h]
>      		push	1
>      		call	near ptr __d_arraycopy
>      		mov	EDX,-4[EBP]
>      		mov	EAX,-8[EBP]
>      		mov	_D4test4pstrAa,EAX
>      		mov	_D4test4pstrAa[04h],EDX
>      		add	ESP,01Ch
>      		leave
>      		ret
>      _D4test2goFZv	ends
> 
> As you can see, __d_newarrayiT is called to allocate dynamic memory for 
> lstr, "hello" is copied into this memory by __d_arraycopy, pstr 
> reassigned, and then the function returns.  There is no delete operation 
> which indicates the memory is actually destroyed.
> 
> In light of the above, I think the current behavior of the 'scope' 
> keyword only applies to classes.  This should possibly be filed as a bug 
> either for the compiler or the spec.
> 
> 
> Sean

That's what I wanted to know, thanks.


More information about the Digitalmars-d-learn mailing list