On 19 August 2015 at 21:00, deadalnix via Digitalmars-d <digitalmars-d@puremagic.com> wrote:
On Wednesday, 19 August 2015 at 18:47:21 UTC, Paulo Pinto wrote:
On Wednesday, 19 August 2015 at 18:41:07 UTC, Walter Bright wrote:
On 8/19/2015 11:03 AM, Jacob Carlborg wrote:
Not sure how the compilers behave in this case but what about devirtualization?
Since I think most developers compile their D programs with all files at once
there should be pretty good opportunities to do devirtualization.

It's true that if generating an exe, the compiler can mark leaf classes as final and get devirtualization. (Of course, you can manually add 'final' to classes.)

It's one way D can generate faster code than C++.

C++ also has final and if I am not mistaken both LLVM and Visual C++ do devirtualization, not sure about other compilers.

GCC is much better than LLVM at this. This is an active area of work in both compiler right now.


Can't speak for LLVM, but scope classes in GDC are *always* devirtualized because the compiler knows the vtable layout and using constant propagation to find the direct call.

You *could* do this with all classes in general, but this is a missed opportunity because the vtable is initialized in the library using memcpy, rather than by the compiler using a direct copy assignment.

https://issues.dlang.org/show_bug.cgi?id=14912

I not sure even LTO/PGO could see through the memcpy to devirtualize even the most basic calls.