Devirtualization and Static Polymorphism
20 points
3 hours ago
| 4 comments
| david.alvarezrosa.com
| HN
gignico
33 seconds ago
[-]
> Under the hood, a virtual table (vtable) is created for each class, and a pointer (vptr) to the vtable is added to each instance.

Coming from C++ I assumed this was the only way but Rust has an interesting approach where objects do not pay any cost because virtual dispatch is handled by fat pointers. So you carry around the `vptr` in fat pointers (`&dyn MyTrait`) only when needed, not in every instance.

reply
hinkley
27 minutes ago
[-]
I wonder if I still have the link.

One of the papers I had bookmarked when toying with my own language design was someone that had worked out how to make interfaces as fast or faster than vtables by using perfect hashing and using the vtable as a hash table instead of a list.

You can also, when inlining a polymorphic call, put a conditional block in that bounces back to full dispatch if the call occasionally doesn’t match the common case. The problem with polymorphic inlining though is that it quickly resembles the exact sort of code we delete and replace with polymorphic dispatch:

    if (typeof arg1 == “string”) {
    } else if typeof arg1 === …) {
    } else if {
    } else if {
    } else {
    }
reply
anitil
1 minute ago
[-]
I've been thinking through what features I'd want in a language if I were designing one myself, and one of my desires is to have exhaustive matches on enums (which could be made of any primitive type) and sum types. The ability to generate perfect hashes at compile time was one of the things that falls out nicely from that
reply
dalvrosa
20 minutes ago
[-]
Nice one, TIL

One caveat with "hash vtables" is that you only really see a performance win when the interface has a lot of specializations.

reply
TimorousBestie
2 minutes ago
[-]
Good article, rare to see simple explanations of intricate C++ ideas.
reply
pjmlp
49 minutes ago
[-]
Nice overview, it misses other kinds of dispatch though.

With concepts, templates and compile time execution, there is no need for CRTP, and in addition it can cover for better error messages regarding what methods to dispatch to.

reply
dalvrosa
24 minutes ago
[-]
Fair. New C++ standards are providing great tools for compile-time everything

But still CRTP is widely used in low-latency environments :)

reply