Short answer: yes, they both allocate memory.

Long answer:

_d_arrayliteralT from gc.d is used to create an array:

import std.stdio;

void main()
{
 foreach(r; [1, 2, 3])
   writefln(r);
 asm { nop; }
 int a,b,c;
 foreach(r; [a, b, c])
   writefln(r);
}

__Dmain comdat
assume CS:__Dmain
L0:  push EBP
 mov EBP,ESP
 sub ESP,028h
 push 3
 push 2
 push 1
 push 3
 push offset FLAT:_D12TypeInfo_G3i6__initZ
 call near ptr __d_arrayliteralT
 mov -024h[EBP],EAX
 mov EAX,-024h[EBP]
 lea EAX,0Ch[EAX]
 mov -020h[EBP],EAX
 add ESP,014h
L27:  mov EAX,-024h[EBP]
 cmp EAX,-020h[EBP]
 jae L4D
 mov EAX,-024h[EBP]
 mov EAX,[EAX]
 mov -01Ch[EBP],EAX
 push dword ptr -01Ch[EBP]
 push offset FLAT:_D12TypeInfo_B1i6__initZ
 call near ptr _D3std5stdio8writeflnFYv
 add dword ptr -024h[EBP],4
 add ESP,8
 jmp short L27
L4D:  nop
 xor EAX,EAX
 mov -018h[EBP],EAX
 mov -014h[EBP],EAX
 mov -010h[EBP],EAX
 push dword ptr -010h[EBP]
 push dword ptr -014h[EBP]
 push dword ptr -018h[EBP]
 push 3
 push offset FLAT:_D12TypeInfo_G3i6__initZ
 call near ptr __d_arrayliteralT
 mov -0Ch[EBP],EAX
 mov EAX,-0Ch[EBP]
 lea EAX,0Ch[EAX]
 mov -8[EBP],EAX
 add ESP,014h
L7D:  mov EAX,-0Ch[EBP]
 cmp EAX,-8[EBP]
 jae LA3
 mov EAX,-0Ch[EBP]
 mov EAX,[EAX]
 mov -4[EBP],EAX
 push dword ptr -4[EBP]
 push offset FLAT:_D12TypeInfo_B1i6__initZ
 call near ptr _D3std5stdio8writeflnFYv
 add dword ptr -0Ch[EBP],4
 add ESP,8
 jmp short L7D
LA3:  mov ESP,EBP
 pop EBP
 ret

"Bill Baxter" <[EMAIL PROTECTED]> wrote in message news:[EMAIL PROTECTED]
Does anyone know off the top of their head if code like this allocates
or not with current DMD 1.x compilers?

foreach(x; [1, 2, 3, 4])
{
    // do something non-allocating with x
}

And is the answer different if the values are only known at runtime? Like here:

void a func(int a1, int a2, int a3)
{
  foreach(x; [a1,a2,a3]) {
        // do something non-allocating with x
  }

}

--bb

Reply via email to