Re: C++ rtti hack
In article <1178877273.764959.52390@l77g2000hsb.googlegroups.com>,
bji-ggcpp@ischo.com wrote:
In this case, I agree
- it is up to the compiler implementation. But what I'm asking is,
does it even make sense for a compiler to *not* make what I am doing
work?
Yes.
Given that the compiler must locate the rtti structure for a
class with a vtable at runtime, how could the compiler lay class
instances out in memory such that the rtti information wasn't in the
same place for each class?
Typically the pointer to the vtable is a hidden data member of the first
class in the hierarchy *to declare a virtual function*. Also, there is
usually not a fixed slot within a vtable for the destructor, since
classes with virtual functions are not required to also have virtual
functions.
Putting it another way ... the compiler *must* make the following code
work correctly (assume that B inherits from A for this example):
B *pB = new B();
A *pA = (A *) pB; // Or dynamic_cast if you like C++ verbosity
if (typeid(*pA) == typeid(*pB)) {
printf("As expected, the typeids match");
}
This is true because A and B are in the same hierarchy of which at least
one function is virtual. Why do you expect this to generalize to
objects of types in different hierarchies?
Given that, wouldn't an unrelated class C have the rtti data at the
same place as B and A did? Why would it have it at any different
place?
Given that one can have base classes with no virtual functions, where
exactly would you put it? The only place I can see would be before the
"this" pointer, and there are performance ramifications for doing so.
Unless the compiler decides that some hierarchies of class
definitions should have rtti in one place, and other hierarchies
should have it in a different place, but why would it ever do that?
To answer questions like this:
1) Read "Inside the C++ Object Model" by Stan Lippman
2) Realize that the material in that book is only one possible
implementation.
--
Nevin ":-)" Liber <mailto:nevin@eviloverlord.com> 773 961-1620
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]