News for hackers. Stuff that matters.
Re:A JVM Does That? (2011) [pdf] by yummyfajitas on Friday July 08, 2016 @06:22AM (#12054550)
The jit can optimize away virtual function calls.

    ParentClass g = ....might be a subclass...

    for (int i=0;i<100000;i++) {
      g.func(i);
    }
The JIT can optimize away the vtable lookups to find func, and sometimes inline the code. Ok, maybe you could do this in C++ too.

    ParentClass[] g = ....might be a subclass...

    for (int i=0;i<100000;i++) {
      g[i].func(i);
    }
Suppose 99% of g's are the same class. The JIT can optimize away most of the virtual function lookups (particularly if this is one of your hotspots). I.e. the code becomes:

    ParentClass[] g = ....might be a subclass...

    for (int i=0;i<100000;i++) {
      if (g.class == COMMONCLASS) {
        inlined_func(i);
      else {
        g[i].func(i);
      }
    }
In the common case, a simple pointer comparison + inlined code is a lot faster than a function dereferene.
Re:A JVM Does That? (2011) [pdf] by vitalyd on Friday July 08, 2016 @08:22AM (#12054943)
Devirtualization is mostly an issue for Java since everything is virtual by default and the language doesn't have support for compile time monomorphization.

While C++ code does use virtuals, it's nowhere near the amount as Java - there are language constructs to avoid that and move the dispatch selection to compile time.

Re:A JVM Does That? (2011) [pdf] by ahh on Friday July 08, 2016 @01:13PM (#12057068)
GCC in fact performs this optimization.
Re:A JVM Does That? (2011) [pdf] by yummyfajitas on Friday July 08, 2016 @11:19PM (#12059925)
GCC can get runtime information at compile time? That's a truly advanced compiler.
Re:A JVM Does That? (2011) [pdf] by ahh on Saturday July 09, 2016 @12:01AM (#12060016)
It can in fact make predictions in a number of circumstances. The most common case is FDO (https://gcc.gnu.org/wiki/AutoFDO) - with FDO coverage GCC can easily demonstrate a particular vcall is ~always a particular type and emit exactly the code you describe. (To be clear, this isn't just in theory, but is actually happening in a wide variety of binaries I use.)

This is perhaps not fully "ahead of time", granted, but it's extremely easy to deploy and highly effective, and entirely accessible to C++.

Re:A JVM Does That? (2011) [pdf] by srean on Monday July 11, 2016 @05:59AM (#12069978)
Snark not warranted, profile guidance is a thing. But more likely many of those virtual functions will not be a virtual function in idiomatic C++ for performance oriented design. I have seen that I can get away with compile time polymorphism many a time. For the rest there is compiler devirtualization and profiles.
Re:A JVM Does That? (2011) [pdf] by richardwhiuk on Friday July 08, 2016 @08:05AM (#12054884)
You could, I guess, annotate C++ child classes as likely, and then perform this optimization. That'd be an extension to the standard of course.