On 19 August 2015 at 21:00, deadalnix via Digitalmars-d < [email protected]> 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.
