On Friday, 20 September 2013 at 07:19:44 UTC, deadalnix wrote:
On Friday, 20 September 2013 at 05:31:09 UTC, Dmitry Leskov
wrote:
Our AOT compiler does inline virtual calls of non-final
methods that are not overloaded in any subclass known at
compile time. Of course, there is a runtime check and a backup
virtual call, but the check is cheap and code size increase in
negligible.
What we don't do (yet) is profile-guided optimizations, but
that is on our to-do list.
So basically what you do is :
funptr = load from vtbl;
if (funptr == compile_time_known_value) {
compile_time_known_value();
} else {
funptr();
}
Which avoid the indirection if the function is actually called
most of the time. Am I right ?
Almost:
funptr = load from vtbl;
if (funptr == compile_time_known_value) {
// Inlined body of compile_time_known_value() goes here
} else {
funptr();
}