dynamic array during appending to array of static array?

bearophile bearophileHUGS at lycos.com
Mon Dec 2 14:49:00 PST 2013


Namespace:

> void main() {
> 	float[3][] arr;
> 	arr ~= [1, 2, 3];
> }
> ----
> It seems [1, 2, 3] is in this case erroneously a dynamic array 
> (according to objconv). So is it also erroneously allocated on 
> the heap?

Generally array literals allocate on the heap. Recently some of 
their cases have being optimized, but even more recently part of 
those optimizations were reverted. So I don't know what's 
happening in your case and why.

With DMD your code generates this (optimized build!), so it's far 
from well optimized:


__Dmain:
     sub ESP,020h
     mov EAX,offset FLAT:_D12TypeInfo_G3f6__initZ
     push    EBX
     push    ESI
     push    EDI
     mov dword ptr 010h[ESP],0
     mov dword ptr 014h[ESP],0
     push    3
     push    EAX
     call    near ptr __d_arrayliteralTX
     mov EBX,EAX
     fld float ptr FLAT:_DATA[00h]
     mov ESI,EBX
     lea EDI,028h[ESP]
     fstp    float ptr [EBX]
     fld float ptr FLAT:_DATA[04h]
     fstp    float ptr 4[EBX]
     fld float ptr FLAT:_DATA[08h]
     fstp    float ptr 8[EBX]
     movsd
     movsd
     movsd
     mov EDX,offset FLAT:_D13TypeInfo_AG3f6__initZ
     push    1
     lea ECX,01Ch[ESP]
     push    ECX
     push    EDX
     call    near ptr __d_arrayappendcTX
     lea ESI,034h[ESP]
     mov 02Ch[ESP],EAX
     mov EDI,02Ch[ESP]
     lea EDI,[EDI*2][EDI]
     mov 030h[ESP],EDX
     mov EAX,030h[ESP]
     lea EDI,-0Ch[EDI*4][EAX]
     movsd
     movsd
     movsd
     add ESP,014h
     xor EAX,EAX
     pop EDI
     pop ESI
     pop EBX
     add ESP,020h
     ret


With ldc2 V.0.12.1 the situation is better:

__Dmain:
     pushl   %ebp
     movl    %esp, %ebp
     andl    $-8, %esp
     subl    $24, %esp
     movl    $0, 16(%esp)
     movl    $0, 20(%esp)
     leal    16(%esp), %eax
     movl    %eax, 4(%esp)
     movl    $1, 8(%esp)
     movl    $__D13TypeInfo_AG3f6__initZ, (%esp)
     calll   __d_arrayappendcTX
     movl    20(%esp), %eax
     movl    $1065353216, (%eax)
     movl    $1073741824, 4(%eax)
     movl    $1077936128, 8(%eax)
     xorl    %eax, %eax
     movl    %ebp, %esp
     popl    %ebp
     ret

Bye,
bearophile


More information about the Digitalmars-d-learn mailing list