Returning large structs == bad
downs
default_357-line at yahoo.de
Fri Feb 15 06:50:56 PST 2008
I ran a comparison of struct vector methods vs freestanding, and the GDC generated assembler code is precisely identical.
Here's my test source
struct foo {
double x, y, z;
void opAddAssign(ref foo bar) {
x += bar.x; y += bar.y; z += bar.z;
}
}
void foo_add(ref foo bar, ref foo baz) {
baz.x += bar.x; baz.y += bar.y; baz.z += bar.z;
}
// prevents overzealous optimization
// really just returns 0, 0, 0
extern(C) foo complex_external_function();
import std.stdio;
void main() {
foo a = complex_external_function(), b = complex_external_function();
asm { int 3; }
a += b;
asm { int 3; }
foo c = complex_external_function(), d = complex_external_function();
asm { int 3; }
foo_add(d, c);
asm { int 3; }
writefln(a, b, c, d);
}
And here are the relevant two bits of assembler.
#APP
int $3
#NO_APP
fldl -120(%ebp)
faddl -96(%ebp)
fstpl -120(%ebp)
fldl -112(%ebp)
faddl -88(%ebp)
fstpl -112(%ebp)
fldl -104(%ebp)
faddl -80(%ebp)
fstpl -104(%ebp)
#APP
int $3
#NO_APP
fldl -72(%ebp)
faddl -48(%ebp)
fstpl -72(%ebp)
fldl -64(%ebp)
faddl -40(%ebp)
fstpl -64(%ebp)
fldl -56(%ebp)
faddl -32(%ebp)
fstpl -56(%ebp)
No difference. But then why the obvious speed difference? Color me confused ._.
--downs
More information about the Digitalmars-d
mailing list