vtable layout

thomson at ca.ibm.com thomson at ca.ibm.com
Mon Aug 30 17:53:23 UTC 1999


>OK, so you *were* proposing that we require something like the above?  I
>see.  That's why you talked about the worst case of 2N slots.  We'd
>need to pad out D's vtable with as many slots as there are slots between
>the B and C vptrs.  I agree that this wouldn't require special handling for
>virtual bases.

Jason, Christophe, I am not so quick.  I don't see how this solves my
diamond case

   struct V1 { virtual void f();  virtual void g(); };
   struct Other1 { virtual void ignore1(); }
   struct X : Other1, virtual V1 { virtual void f(); }

   struct Y : Other1, virtual V1 { virtual void g(); }

   struct ZZ: X, Y {}

You want the adjustment values allocated in the derived class vtable, so
aggregate vtables for X look something like this

               offset_X_to_V1            ; the adjustment value for X::f
_vft_X:        rtti/dyncast info?
               &X::f                          ; replicated, calls primary entry
_vft_Other1_X: rtti/dyncast
               &Other1::ignore1
_vft_V1_X:          rtti/dyncast
               &X::f__2                  ; calls secondary entry
               &V1::g

and for Y like this:

               offset_Y_to_V1            ; the adjustment value for Y::g
_vft_Y:        rtti/dyncast
               &Y::g                          ; replicated, calls primary entry
_vft_Other1_Y: rtti/dyncast
               &Other1::ignore1
_vft_V1_Y:          rtti/dyncast
               &V1::f
               &Y::g__2                  ; calls secondary entry


That means X::f__2 finds its adjustment offset at vptr-40, and the same goes for
Y::g__2.  Now how do you lay out the vtables for ZZ?



Brian Thomson
VisualAge C/C++ Chief Architect






More information about the cxx-abi-dev mailing list