final
is an excellent keyword. It lets me prevent inheritance from a class. It also lets the compiler skip the runtime dispatch mechanisms when calling virtual functions or accessing virtual bases.
Suppose now that I have some non-final
class T
with virtual functions and/or base classes. Suppose also that I have a reference to an instance of this class. How could I tell the compiler that this particular reference is to the fully-derived complete object, and not to a base sub-object of a more derived type?
My motivations are classes like optional
and vector
. If I invoke optional<T>::operator*()
, I get a T&
. However, I know with certainty that this reference really is a T
, not some more derived object. The same applies to vector<T>
and all the ways I have of accessing its elements.
I think it would be a great optimization to skip the dynamic dispatch in such cases, especially in debug mode and on compilers not smart enough to look through the optional
and vector
implementations and devirtualize the calls.
Aucun commentaire:
Enregistrer un commentaire