Static array initialization

bearophile bearophileHUGS at lycos.com
Sat Jul 17 10:15:18 PDT 2010


I remember Don saying something about this some time ago, but I don't remember what he said and what the conclusion was.

This is a small D2 program that contains the initialization of a small fixed-size array allocated on the stack:


import std.c.stdio: printf;
import std.c.stdlib: atof;
void main() {
    double x = atof("1.0");
    double y = atof("2.0");
    double[2] arr = [x, y];
    printf("%f\n", arr[1]);
}


The asm generated by dmd in an optimized build shows two calls to initialize the array. Can such calls be removed in this simple situation?

------------

DMD:
__Dmain comdat
        sub ESP,04Ch
        mov EAX,offset FLAT:_DATA
        push    EBX
        push    ESI
        push    EAX
        call    near ptr _atof
        mov ECX,offset FLAT:_DATA[4]
        fstp    qword ptr 010h[ESP]
        push    010h
        push    ECX
        call    near ptr _atof
        add ESP,0FFFFFFFCh
        mov EDX,offset FLAT:_D12TypeInfo_xAd6__initZ
        fstp    qword ptr [ESP]
        push    dword ptr 020h[ESP]
        push    dword ptr 020h[ESP]
        push    2
        push    EDX
>       call    near ptr __d_arrayliteralT
        add ESP,018h
        push    EAX
        lea EBX,028h[ESP]
        push    EBX
>       call    near ptr _memcpy
        mov ESI,offset FLAT:_DATA[8]
        push    dword ptr 038h[ESP]
        push    dword ptr 038h[ESP]
        push    ESI
        call    near ptr _printf
        add ESP,01Ch
        xor EAX,EAX
        pop ESI
        pop EBX
        add ESP,04Ch
        ret

------------

LDC:
_Dmain:
    subl    $52, %esp
    movl    $.str, (%esp)
    call    atof
    fstpt   28(%esp)
    movl    $.str1, (%esp)
    call    atof
    fstpt   16(%esp)
    movl    $2, 4(%esp)
    movl    $_D11TypeInfo_Ad6__initZ, (%esp)
>   call    _d_newarrayvT
    fldt    28(%esp)
    fstpl   (%eax)
    fldt    16(%esp)
    fstpl   40(%esp)
    movsd   40(%esp), %xmm0
    movsd   %xmm0, 8(%eax)
    movsd   %xmm0, 4(%esp)
    movl    $.str2, (%esp)
    call    printf
    xorl    %eax, %eax
    addl    $52, %esp
    ret $8

------------

Bye,
bearophile


More information about the Digitalmars-d mailing list