On Mon, 21 Sep 2009 16:29:11 -0400, Bill Baxter <wbax...@gmail.com> wrote:

On Mon, Sep 21, 2009 at 12:53 PM, Jeremie Pelletier <jerem...@gmail.com> wrote:
Right now the compiler makes a temporary copy of referenced parameters on the stack, calls the function with a pointer to the stack copy, and once the
function returns copies the modified temporary back to its original
location. This is quite considerable overhead.

Are you sure this is true? I don't have a d2 compiler right now, but that
sounds like a *huge* step in the wrong direction.  D1 does not do this
(tested dmd 1.046).

Yeah I started a thread about that a few months ago in digitalmars.D, its
something that's on the bugzilla I believe.

I think this is the only bugzilla bug about speed of reference parameters:
http://d.puremagic.com/issues/show_bug.cgi?id=2008

It does not mention the copying issue in D2 you talk about, only lack
of inlining in D1 and D2.  But I think the asm code posted there may
be doing that copying.  Not a big ASM guru though.

I don't think it's doing that. I think it's pushing the pointers onto the stack (as expected).

I'm also not an asm guru :)

Note that some of the assembler instructions at the beginning of the function are to initialize the variables a and b to 0.

Here is my test code, and relevant asm output (dmd 1.046, no inline or release), note the void initialization to prevent the initializing of the structure before passing:


struct S
{
    int x;
    int y;
    int z;
}

void foo(ref S s)
{
    s.x = 5;
    s.y = 6;
    s.z = 7;
}

void main()
{
    S s = void;
    foo(s);
}

_D6testme3fooFKS6testme1SZv:
                push    EBP
                mov     EBP,ESP
                mov     dword ptr [EAX],5
                mov     dword ptr 4[EAX],6
                mov     dword ptr 8[EAX],7
                pop     EBP
                ret
                nop
                nop
                nop
.text._D6testme3fooFKS6testme1SZv       ends

...

_Dmain:
                push    EBP
                mov     EBP,ESP
                sub     ESP,0Ch
lea EAX,-0Ch[EBP] ; I think this puts the pointer into the EAX register for the call
                call    near ptr _d6testme3foofks6testme1...@pc32
                xor     EAX,EAX
                leave
                ret
.text._Dmain    ends


-Steve

Reply via email to