Re: Cost of dynamic_cast
Ole Nielsby wrote:
I just happened to F11 into a dynamic_cast in a disassember
window, and I was stunned by the complexity of this operation.
I have used it in quite a few places, assuming the operation
would be fast.
>
In single-inheritance systems like Java and .NET, the operation
is - or ought to be - pretty fast. I know multiple inheritance is
bound to complicate matters a bit, but C++ is supposed to be
a langage where you don't pay for what you don't use, so I
expected the cast would be fast when no multiple inheritance
is involved.
On Windows, it is possible to have multiple copies of the RTTI of a
class due to the fact that the same class can be compiled into multiple
modules of a single process (e.g. it might be in the .exe and in 3
..dlls). As a result, dynamic_cast actually performs string comparisons
against fully qualified class names (or some kind of mangled version) to
work out if two typeids actually match. dynamic_cast has to check
whether the cast-to class is a base of the dynamic type of the object,
so it potentially has to perform a series of these comparisons.
Linux doesn't have this problem, due to the use of "weak" symbols in its
shared libraries (all RTTIs are in effect merged at library load time).
Windows could fix the problem by having some RTTI merging code called at
DLL load time, but that would just move the performance penalty. String
hashing in the RTTI is a simple optimization they could add though.
Should I go like:
class A;
class B;
class Base {
public:
virtual *A as_A() {return NULL;}
virtual *B as_B() {return NULL;}
};
class A {public: *A as_A() {return this;}};
class B {public: *B as_B() {return this;}};
(and accept a vtable bloat of order N^2)
or is there a better way???
The better way is to avoid designs that rely heavily on dynamic_cast.
Why do you need to dynamic_cast?
Tom