inlining final functions
Jonathan M Davis
jmdavisProg at gmx.com
Tue Feb 26 08:38:48 PST 2013
On Tuesday, February 26, 2013 10:20:21 n00b wrote:
> Is the following correct :
>
> class X
> {
> void foo() { ... }
> }
> class Y : X
> {
> final override void foo() { ... }
> }
>
>
> Y y = new Y;
> y.foo; //inlined
> X x = y;
> x.foo; //not inlined
Y.foo can be made non-virtual by the compiler, because it's final. X.foo can't
be, because it's overridden, and virtual functions can't normally be inlined,
because they have to be looked up at runtime (because they depend on the
underlying type, not the type of the reference). A particularly advanced
optimizer might be able to inline them both in this case, because it's
possible to see that x is really a Y by following the flow of the code, but dmd
doesn't generally do flow analysis, so it won't figure that out, and as soon as
the code isn't this straightforward, even a more advanced optimizer couldn't
figure that out. On top of that, dmd's inliner is generally accused of being
fairly poor (though I don't know how good it really is for certain, because
I've never sat down to try and figure out for sure what is and isn't inlined).
So, yes. What you're seeing is perfectly correct and expected.
- Jonathan M Davis
More information about the Digitalmars-d-learn
mailing list