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