2008-09-16 4 views
15

VTable 구조, 순서 및 내용에 대한 세부 정보와 개체 내의 vtable 포인터 위치를 찾고 있습니다.GCC 3.x 및 4.x의 C++ 객체에서 VTable 레이아웃 및 VTable 포인터 위치는 무엇입니까?

이상적으로 이것은 단일 상속, 다중 상속 및 가상 상속을 포함합니다. 외부 문서에

참고도

GCC의 4.0 클래스 레이아웃의 문서 here을하고 Itanium 및 더 넓게 GNU를 감상 할 수있다, ABI 레이아웃 문서 here입니다.

+3

이것은 아마도 [C++ ABI] (http://www.codesourcery.com/public/cxx-abi/)에 설명되어 있습니다. 예 : [C++ VTable 예제] (http://mentorembedded.github.com/cxx-abi/abi-examples.html). – squadette

+3

gcc의 '-fdump-class-hierarchy'옵션을 사용해 보셨습니까? – jaor

+0

이전 링크가 죽었습니다! D : – minmaxavg

답변

-4

필자가 보았던 대부분의 컴파일러 구현은 기본 객체를 파생 객체에 "포함"했습니다. 참조가 평가 될 때 객체에 대한 상대 오프셋이 컴파일 시간에 추가되기 때문에 vtable이 보관되는 곳과 관련이 없습니다.

다중 상속과 가상 상속은 더 복잡하고 액세스되는 대상에 따라 다른 오프셋을 요구할 수 있습니다. The Impossibly Fast C++ Delegates

그것은 훌륭하게 상속의 다양한 측면을 처리하는 방법을 다른 컴파일러의 다양한 사진을 제공합니다

은 내가보기 엔 코드 프로젝트에이 기사를 읽어 보시기 바랍니다. 다른 컴파일러의 낮은 수준의 동작에 관심이 있다면 환상적인 읽기.

편집 :저기서 잘못된 기사를 연결했습니다. 수정 됨.

+1

"vtable이 보관되는 곳과 관련이 없습니다." 문제의 절반은 다른 유형의 상속을 위해 어디에 보관되는지에 대해 구체적으로 묻고있었습니다. 하나는 '중요하지 않습니다'라고 말하면 나머지는 '복잡합니다'라는 대답은 아닙니다. 또한 질문의 나머지 절반을 놓치고 vtable이 어떻게 구성되어 있는지 묻습니다. –

+0

또한이 기사가 어떻게 컴파일러가 상속을 처리하는지 설명하지 못합니다.그것이 말하는 모든 것은 직교 개념 인 대표자입니다. –

8

가상 테이블은 일반적으로 데이터 포인터 (MI 및 VI 시나리오 또는 typeinfos), 정수 (fixups) 또는 센티넬 요소 (예 : NULL)를 넣을 수 있지만 함수 포인터의 배열로 처리됩니다. 포인터)도 포함시킵니다. 레이아웃은 일반적으로 컴파일러 관련 (또는 여러 개의 C++ 컴파일러가 ABI를 공유하는 ABI 전용)이지만 컴파일되는 클래스가 안정된 인터페이스를 제공한다면 안정적입니다 (그렇지 않으면 항상 코드를 다시 컴파일해야하므로 끌림입니다) . 가상 및 다중 상속과 관련된 코너 사례를 처리하고 파생 된 클래스 생성 중에 가상 호출이 표준에서 말한대로 작동하도록하는 데 필요한 추가 테이블도 있습니다. 이러한 상황에서는 VTT 및 구성 테이블이 출력은 다음과 같습니다.

GCC 4.x의 특정 사례에 대해 : -fdump-class-hierarchy 스위치는 실제로 설명 된대로 작동합니다. 나는 아래의 샘플 코드를 사용하여 Coliru에 그것을 테스트 :

struct Base 
{ 
    virtual ~Base() {} 
    virtual void f() = 0; 
}; 

struct OtherBase 
{ 
    virtual ~OtherBase() {} 
    virtual void g() {} 
}; 

struct Derived: public Base 
{ 
    virtual ~Derived() {} 
    virtual void f() {} 
}; 

struct MultiplyDerived: public Base, public OtherBase 
{ 
    virtual ~MultiplyDerived() {} 
    virtual void f() {} 
    virtual void g() {} 
}; 

struct OtherDerived: public Base 
{ 
    virtual ~OtherDerived() {} 
    virtual void f() {} 
}; 

struct DiamondDerived: public Derived, public OtherDerived 
{ 
    virtual ~DiamondDerived() {} 
    virtual void f() {} 
}; 

struct VirtuallyDerived: virtual public Base 
{ 
    virtual ~VirtuallyDerived() {} 
    virtual void f() {} 
}; 

struct OtherVirtuallyDerived: virtual public Base 
{ 
    virtual ~OtherVirtuallyDerived() {} 
    virtual void f() {} 
}; 

struct VirtuallyDiamondDerived: public VirtuallyDerived, public OtherVirtuallyDerived 
{ 
    virtual ~VirtuallyDiamondDerived() {} 
    virtual void f() {} 
}; 

struct DoublyVirtuallyDiamondDerived: virtual public VirtuallyDerived, virtual public OtherVirtuallyDerived 
{ 
    virtual ~DoublyVirtuallyDiamondDerived() {} 
    virtual void f() {} 
}; 

struct MixedVirtuallyDerived: virtual public Base, public OtherBase 
{ 
    virtual ~MixedVirtuallyDerived() {} 
}; 

struct MixedVirtuallyDiamondDerived: public VirtuallyDerived, public MixedVirtuallyDerived 
{ 
    virtual ~MixedVirtuallyDiamondDerived() {} 
    virtual void f() {} 
    virtual void g() {} 
}; 

struct VirtuallyMultiplyDerived: virtual public Base, virtual public OtherBase 
{ 
    virtual ~VirtuallyMultiplyDerived() {} 
}; 

struct OtherVirtuallyMultiplyDerived: virtual public Base, virtual public OtherBase 
{ 
    virtual ~OtherVirtuallyMultiplyDerived() {} 
}; 

struct MultiplyVirtuallyDiamondDerived: public VirtuallyMultiplyDerived, public OtherVirtuallyMultiplyDerived 
{ 
    virtual ~MultiplyVirtuallyDiamondDerived() {} 
    virtual void f() {} 
    virtual void g() {} 
}; 

및 G에서 ++ (변환 된 이름의 안내를받은 : TI의 typeinfos, TV 년대 있습니다 vtable을, 그리고 목의와 TV의 존재 올바른 가상 통화를하는 데 사용 썽크 있습니다 복수 및/또는 가상 상속) :

 
Vtable for Base 

Base::_ZTV4Base: 5u entries 

0  (int (*)(...))0 

8  (int (*)(...))(& _ZTI4Base) 

16 0u 

24 0u 

32 (int (*)(...))__cxa_pure_virtual 


Class Base 

    size=8 align=8 

    base size=8 base align=8 

Base (0x0x7fd42c0355a0) 0 nearly-empty 

    vptr=((& Base::_ZTV4Base) + 16u) 


Vtable for OtherBase 

OtherBase::_ZTV9OtherBase: 5u entries 

0  (int (*)(...))0 

8  (int (*)(...))(& _ZTI9OtherBase) 

16 (int (*)(...))OtherBase::~OtherBase 

24 (int (*)(...))OtherBase::~OtherBase 

32 (int (*)(...))OtherBase::g 


Class OtherBase 

    size=8 align=8 

    base size=8 base align=8 

OtherBase (0x0x7fd42c035600) 0 nearly-empty 

    vptr=((& OtherBase::_ZTV9OtherBase) + 16u) 


Vtable for Derived 

Derived::_ZTV7Derived: 5u entries 

0  (int (*)(...))0 

8  (int (*)(...))(& _ZTI7Derived) 

16 (int (*)(...))Derived::~Derived 

24 (int (*)(...))Derived::~Derived 

32 (int (*)(...))Derived::f 


Class Derived 

    size=8 align=8 

    base size=8 base align=8 

Derived (0x0x7fd42c02d138) 0 nearly-empty 

    vptr=((& Derived::_ZTV7Derived) + 16u) 

    Base (0x0x7fd42c035660) 0 nearly-empty 

     primary-for Derived (0x0x7fd42c02d138) 


Vtable for MultiplyDerived 

MultiplyDerived::_ZTV15MultiplyDerived: 11u entries 

0  (int (*)(...))0 

8  (int (*)(...))(& _ZTI15MultiplyDerived) 

16 (int (*)(...))MultiplyDerived::~MultiplyDerived 

24 (int (*)(...))MultiplyDerived::~MultiplyDerived 

32 (int (*)(...))MultiplyDerived::f 

40 (int (*)(...))MultiplyDerived::g 

48 (int (*)(...))-8 

56 (int (*)(...))(& _ZTI15MultiplyDerived) 

64 (int (*)(...))MultiplyDerived::_ZThn8_N15MultiplyDerivedD1Ev 

72 (int (*)(...))MultiplyDerived::_ZThn8_N15MultiplyDerivedD0Ev 

80 (int (*)(...))MultiplyDerived::_ZThn8_N15MultiplyDerived1gEv 


Class MultiplyDerived 

    size=16 align=8 

    base size=16 base align=8 

MultiplyDerived (0x0x7fd42c04aaf0) 0 

    vptr=((& MultiplyDerived::_ZTV15MultiplyDerived) + 16u) 

    Base (0x0x7fd42c0356c0) 0 nearly-empty 

     primary-for MultiplyDerived (0x0x7fd42c04aaf0) 

    OtherBase (0x0x7fd42c035720) 8 nearly-empty 

     vptr=((& MultiplyDerived::_ZTV15MultiplyDerived) + 64u) 


Vtable for OtherDerived 

OtherDerived::_ZTV12OtherDerived: 5u entries 

0  (int (*)(...))0 

8  (int (*)(...))(& _ZTI12OtherDerived) 

16 (int (*)(...))OtherDerived::~OtherDerived 

24 (int (*)(...))OtherDerived::~OtherDerived 

32 (int (*)(...))OtherDerived::f 


Class OtherDerived 

    size=8 align=8 

    base size=8 base align=8 

OtherDerived (0x0x7fd42c02d1a0) 0 nearly-empty 

    vptr=((& OtherDerived::_ZTV12OtherDerived) + 16u) 

    Base (0x0x7fd42c035780) 0 nearly-empty 

     primary-for OtherDerived (0x0x7fd42c02d1a0) 


Vtable for DiamondDerived 

DiamondDerived::_ZTV14DiamondDerived: 10u entries 

0  (int (*)(...))0 

8  (int (*)(...))(& _ZTI14DiamondDerived) 

16 (int (*)(...))DiamondDerived::~DiamondDerived 

24 (int (*)(...))DiamondDerived::~DiamondDerived 

32 (int (*)(...))DiamondDerived::f 

40 (int (*)(...))-8 

48 (int (*)(...))(& _ZTI14DiamondDerived) 

56 (int (*)(...))DiamondDerived::_ZThn8_N14DiamondDerivedD1Ev 

64 (int (*)(...))DiamondDerived::_ZThn8_N14DiamondDerivedD0Ev 

72 (int (*)(...))DiamondDerived::_ZThn8_N14DiamondDerived1fEv 


Class DiamondDerived 

    size=16 align=8 

    base size=16 base align=8 

DiamondDerived (0x0x7fd42c0625b0) 0 

    vptr=((& DiamondDerived::_ZTV14DiamondDerived) + 16u) 

    Derived (0x0x7fd42c02d208) 0 nearly-empty 

     primary-for DiamondDerived (0x0x7fd42c0625b0) 

    Base (0x0x7fd42c0357e0) 0 nearly-empty 

     primary-for Derived (0x0x7fd42c02d208) 

    OtherDerived (0x0x7fd42c02d270) 8 nearly-empty 

     vptr=((& DiamondDerived::_ZTV14DiamondDerived) + 56u) 

    Base (0x0x7fd42c035840) 8 nearly-empty 

     primary-for OtherDerived (0x0x7fd42c02d270) 


Vtable for VirtuallyDerived 

VirtuallyDerived::_ZTV16VirtuallyDerived: 8u entries 

0  0u 

8  0u 

16 0u 

24 (int (*)(...))0 

32 (int (*)(...))(& _ZTI16VirtuallyDerived) 

40 (int (*)(...))VirtuallyDerived::~VirtuallyDerived 

48 (int (*)(...))VirtuallyDerived::~VirtuallyDerived 

56 (int (*)(...))VirtuallyDerived::f 


VTT for VirtuallyDerived 

VirtuallyDerived::_ZTT16VirtuallyDerived: 2u entries 

0  ((& VirtuallyDerived::_ZTV16VirtuallyDerived) + 40u) 

8  ((& VirtuallyDerived::_ZTV16VirtuallyDerived) + 40u) 


Class VirtuallyDerived 

    size=8 align=8 

    base size=8 base align=8 

VirtuallyDerived (0x0x7fd42c02d2d8) 0 nearly-empty 

    vptridx=0u vptr=((& VirtuallyDerived::_ZTV16VirtuallyDerived) + 40u) 

    Base (0x0x7fd42c0358a0) 0 nearly-empty virtual 

     primary-for VirtuallyDerived (0x0x7fd42c02d2d8) 

     vptridx=8u vbaseoffset=-40 


Vtable for OtherVirtuallyDerived 

OtherVirtuallyDerived::_ZTV21OtherVirtuallyDerived: 8u entries 

0  0u 

8  0u 

16 0u 

24 (int (*)(...))0 

32 (int (*)(...))(& _ZTI21OtherVirtuallyDerived) 

40 (int (*)(...))OtherVirtuallyDerived::~OtherVirtuallyDerived 

48 (int (*)(...))OtherVirtuallyDerived::~OtherVirtuallyDerived 

56 (int (*)(...))OtherVirtuallyDerived::f 


VTT for OtherVirtuallyDerived 

OtherVirtuallyDerived::_ZTT21OtherVirtuallyDerived: 2u entries 

0  ((& OtherVirtuallyDerived::_ZTV21OtherVirtuallyDerived) + 40u) 

8  ((& OtherVirtuallyDerived::_ZTV21OtherVirtuallyDerived) + 40u) 


Class OtherVirtuallyDerived 

    size=8 align=8 

    base size=8 base align=8 

OtherVirtuallyDerived (0x0x7fd42c02d340) 0 nearly-empty 

    vptridx=0u vptr=((& OtherVirtuallyDerived::_ZTV21OtherVirtuallyDerived) + 40u) 

    Base (0x0x7fd42c035900) 0 nearly-empty virtual 

     primary-for OtherVirtuallyDerived (0x0x7fd42c02d340) 

     vptridx=8u vbaseoffset=-40 


Vtable for VirtuallyDiamondDerived 

VirtuallyDiamondDerived::_ZTV23VirtuallyDiamondDerived: 16u entries 

0  0u 

8  0u 

16 0u 

24 (int (*)(...))0 

32 (int (*)(...))(& _ZTI23VirtuallyDiamondDerived) 

40 (int (*)(...))VirtuallyDiamondDerived::~VirtuallyDiamondDerived 

48 (int (*)(...))VirtuallyDiamondDerived::~VirtuallyDiamondDerived 

56 (int (*)(...))VirtuallyDiamondDerived::f 

64 18446744073709551608u 

72 18446744073709551608u 

80 18446744073709551608u 

88 (int (*)(...))-8 

96 (int (*)(...))(& _ZTI23VirtuallyDiamondDerived) 

104 (int (*)(...))VirtuallyDiamondDerived::_ZThn8_N23VirtuallyDiamondDerivedD1Ev 

112 (int (*)(...))VirtuallyDiamondDerived::_ZThn8_N23VirtuallyDiamondDerivedD0Ev 

120 (int (*)(...))VirtuallyDiamondDerived::_ZThn8_N23VirtuallyDiamondDerived1fEv 


Construction vtable for VirtuallyDerived (0x0x7fd42c02d3a8 instance) in VirtuallyDiamondDerived 

VirtuallyDiamondDerived::_ZTC23VirtuallyDiamondDerived0_16VirtuallyDerived: 8u entries 

0  0u 

8  0u 

16 0u 

24 (int (*)(...))0 

32 (int (*)(...))(& _ZTI16VirtuallyDerived) 

40 0u 

48 0u 

56 (int (*)(...))VirtuallyDerived::f 


Construction vtable for OtherVirtuallyDerived (0x0x7fd42c02d410 instance) in VirtuallyDiamondDerived 

VirtuallyDiamondDerived::_ZTC23VirtuallyDiamondDerived8_21OtherVirtuallyDerived: 15u entries 

0  18446744073709551608u 

8  0u 

16 0u 

24 (int (*)(...))0 

32 (int (*)(...))(& _ZTI21OtherVirtuallyDerived) 

40 0u 

48 0u 

56 (int (*)(...))OtherVirtuallyDerived::f 

64 8u 

72 8u 

80 (int (*)(...))8 

88 (int (*)(...))(& _ZTI21OtherVirtuallyDerived) 

96 0u 

104 0u 

112 (int (*)(...))OtherVirtuallyDerived::_ZTv0_n32_N21OtherVirtuallyDerived1fEv 


VTT for VirtuallyDiamondDerived 

VirtuallyDiamondDerived::_ZTT23VirtuallyDiamondDerived: 7u entries 

0  ((& VirtuallyDiamondDerived::_ZTV23VirtuallyDiamondDerived) + 40u) 

8  ((& VirtuallyDiamondDerived::_ZTC23VirtuallyDiamondDerived0_16VirtuallyDerived) + 40u) 

16 ((& VirtuallyDiamondDerived::_ZTC23VirtuallyDiamondDerived0_16VirtuallyDerived) + 40u) 

24 ((& VirtuallyDiamondDerived::_ZTC23VirtuallyDiamondDerived8_21OtherVirtuallyDerived) + 40u) 

32 ((& VirtuallyDiamondDerived::_ZTC23VirtuallyDiamondDerived8_21OtherVirtuallyDerived) + 96u) 

40 ((& VirtuallyDiamondDerived::_ZTV23VirtuallyDiamondDerived) + 40u) 

48 ((& VirtuallyDiamondDerived::_ZTV23VirtuallyDiamondDerived) + 104u) 


Class VirtuallyDiamondDerived 

    size=16 align=8 

    base size=16 base align=8 

VirtuallyDiamondDerived (0x0x7fd42c07e460) 0 

    vptridx=0u vptr=((& VirtuallyDiamondDerived::_ZTV23VirtuallyDiamondDerived) + 40u) 

    VirtuallyDerived (0x0x7fd42c02d3a8) 0 nearly-empty 

     primary-for VirtuallyDiamondDerived (0x0x7fd42c07e460) 

     subvttidx=8u 

    Base (0x0x7fd42c035960) 0 nearly-empty virtual 

     primary-for VirtuallyDerived (0x0x7fd42c02d3a8) 

     vptridx=40u vbaseoffset=-40 

    OtherVirtuallyDerived (0x0x7fd42c02d410) 8 nearly-empty 

     lost-primary 

     subvttidx=24u vptridx=48u vptr=((& VirtuallyDiamondDerived::_ZTV23VirtuallyDiamondDerived) + 104u) 

    Base (0x0x7fd42c035960) alternative-path 


Vtable for DoublyVirtuallyDiamondDerived 

DoublyVirtuallyDiamondDerived::_ZTV29DoublyVirtuallyDiamondDerived: 18u entries 

0  8u 

8  0u 

16 0u 

24 0u 

32 0u 

40 (int (*)(...))0 

48 (int (*)(...))(& _ZTI29DoublyVirtuallyDiamondDerived) 

56 (int (*)(...))DoublyVirtuallyDiamondDerived::~DoublyVirtuallyDiamondDerived 

64 (int (*)(...))DoublyVirtuallyDiamondDerived::~DoublyVirtuallyDiamondDerived 

72 (int (*)(...))DoublyVirtuallyDiamondDerived::f 

80 18446744073709551608u 

88 18446744073709551608u 

96 18446744073709551608u 

104 (int (*)(...))-8 

112 (int (*)(...))(& _ZTI29DoublyVirtuallyDiamondDerived) 

120 (int (*)(...))DoublyVirtuallyDiamondDerived::_ZTv0_n24_N29DoublyVirtuallyDiamondDerivedD1Ev 

128 (int (*)(...))DoublyVirtuallyDiamondDerived::_ZTv0_n24_N29DoublyVirtuallyDiamondDerivedD0Ev 

136 (int (*)(...))DoublyVirtuallyDiamondDerived::_ZTv0_n32_N29DoublyVirtuallyDiamondDerived1fEv 


Construction vtable for VirtuallyDerived in DoublyVirtuallyDiamondDerived 

DoublyVirtuallyDiamondDerived::_ZTC29DoublyVirtuallyDiamondDerived0_16VirtuallyDerived: 8u entries 

0  0u 

8  0u 

16 0u 

24 (int (*)(...))0 

32 (int (*)(...))(& _ZTI16VirtuallyDerived) 

40 0u 

48 0u 

56 (int (*)(...))VirtuallyDerived::f 


Construction vtable for OtherVirtuallyDerived in DoublyVirtuallyDiamondDerived 

DoublyVirtuallyDiamondDerived::_ZTC29DoublyVirtuallyDiamondDerived8_21OtherVirtuallyDerived: 15u entries 

0  18446744073709551608u 

8  0u 

16 0u 

24 (int (*)(...))0 

32 (int (*)(...))(& _ZTI21OtherVirtuallyDerived) 

40 0u 

48 0u 

56 (int (*)(...))OtherVirtuallyDerived::f 

64 8u 

72 8u 

80 (int (*)(...))8 

88 (int (*)(...))(& _ZTI21OtherVirtuallyDerived) 

96 0u 

104 0u 

112 (int (*)(...))OtherVirtuallyDerived::_ZTv0_n32_N21OtherVirtuallyDerived1fEv 


VTT for DoublyVirtuallyDiamondDerived 

DoublyVirtuallyDiamondDerived::_ZTT29DoublyVirtuallyDiamondDerived: 8u entries 

0  ((& DoublyVirtuallyDiamondDerived::_ZTV29DoublyVirtuallyDiamondDerived) + 56u) 

8  ((& DoublyVirtuallyDiamondDerived::_ZTV29DoublyVirtuallyDiamondDerived) + 56u) 

16 ((& DoublyVirtuallyDiamondDerived::_ZTV29DoublyVirtuallyDiamondDerived) + 56u) 

24 ((& DoublyVirtuallyDiamondDerived::_ZTV29DoublyVirtuallyDiamondDerived) + 120u) 

32 ((& DoublyVirtuallyDiamondDerived::_ZTC29DoublyVirtuallyDiamondDerived0_16VirtuallyDerived) + 40u) 

40 ((& DoublyVirtuallyDiamondDerived::_ZTC29DoublyVirtuallyDiamondDerived0_16VirtuallyDerived) + 40u) 

48 ((& DoublyVirtuallyDiamondDerived::_ZTC29DoublyVirtuallyDiamondDerived8_21OtherVirtuallyDerived) + 40u) 

56 ((& DoublyVirtuallyDiamondDerived::_ZTC29DoublyVirtuallyDiamondDerived8_21OtherVirtuallyDerived) + 96u) 


Class DoublyVirtuallyDiamondDerived 

    size=16 align=8 

    base size=8 base align=8 

DoublyVirtuallyDiamondDerived (0x0x7fd42c07ea10) 0 nearly-empty 

    vptridx=0u vptr=((& DoublyVirtuallyDiamondDerived::_ZTV29DoublyVirtuallyDiamondDerived) + 56u) 

    VirtuallyDerived (0x0x7fd42c02d478) 0 nearly-empty virtual 

     primary-for DoublyVirtuallyDiamondDerived (0x0x7fd42c07ea10) 

     subvttidx=32u vptridx=8u vbaseoffset=-48 

    Base (0x0x7fd42c035a80) 0 nearly-empty virtual 

     primary-for VirtuallyDerived (0x0x7fd42c02d478) 

     vptridx=16u vbaseoffset=-40 

    OtherVirtuallyDerived (0x0x7fd42c02d4e0) 8 nearly-empty virtual 

     lost-primary 

     subvttidx=48u vptridx=24u vbaseoffset=-56 vptr=((& DoublyVirtuallyDiamondDerived::_ZTV29DoublyVirtuallyDiamondDerived) + 120u) 

    Base (0x0x7fd42c035a80) alternative-path 


Vtable for MixedVirtuallyDerived 

MixedVirtuallyDerived::_ZTV21MixedVirtuallyDerived: 13u entries 

0  8u 

8  (int (*)(...))0 

16 (int (*)(...))(& _ZTI21MixedVirtuallyDerived) 

24 0u 

32 0u 

40 (int (*)(...))OtherBase::g 

48 0u 

56 18446744073709551608u 

64 (int (*)(...))-8 

72 (int (*)(...))(& _ZTI21MixedVirtuallyDerived) 

80 0u 

88 0u 

96 (int (*)(...))__cxa_pure_virtual 


VTT for MixedVirtuallyDerived 

MixedVirtuallyDerived::_ZTT21MixedVirtuallyDerived: 2u entries 

0  ((& MixedVirtuallyDerived::_ZTV21MixedVirtuallyDerived) + 24u) 

8  ((& MixedVirtuallyDerived::_ZTV21MixedVirtuallyDerived) + 80u) 


Class MixedVirtuallyDerived 

    size=16 align=8 

    base size=8 base align=8 

MixedVirtuallyDerived (0x0x7fd42c07eee0) 0 nearly-empty 

    vptridx=0u vptr=((& MixedVirtuallyDerived::_ZTV21MixedVirtuallyDerived) + 24u) 

    Base (0x0x7fd42c035c60) 8 nearly-empty virtual 

     vptridx=8u vbaseoffset=-24 vptr=((& MixedVirtuallyDerived::_ZTV21MixedVirtuallyDerived) + 80u) 

    OtherBase (0x0x7fd42c035cc0) 0 nearly-empty 

     primary-for MixedVirtuallyDerived (0x0x7fd42c07eee0) 


Vtable for MixedVirtuallyDiamondDerived 

MixedVirtuallyDiamondDerived::_ZTV28MixedVirtuallyDiamondDerived: 15u entries 

0  0u 

8  0u 

16 0u 

24 (int (*)(...))0 

32 (int (*)(...))(& _ZTI28MixedVirtuallyDiamondDerived) 

40 (int (*)(...))MixedVirtuallyDiamondDerived::~MixedVirtuallyDiamondDerived 

48 (int (*)(...))MixedVirtuallyDiamondDerived::~MixedVirtuallyDiamondDerived 

56 (int (*)(...))MixedVirtuallyDiamondDerived::f 

64 (int (*)(...))MixedVirtuallyDiamondDerived::g 

72 18446744073709551608u 

80 (int (*)(...))-8 

88 (int (*)(...))(& _ZTI28MixedVirtuallyDiamondDerived) 

96 (int (*)(...))MixedVirtuallyDiamondDerived::_ZThn8_N28MixedVirtuallyDiamondDerivedD1Ev 

104 (int (*)(...))MixedVirtuallyDiamondDerived::_ZThn8_N28MixedVirtuallyDiamondDerivedD0Ev 

112 (int (*)(...))MixedVirtuallyDiamondDerived::_ZThn8_N28MixedVirtuallyDiamondDerived1gEv 


Construction vtable for VirtuallyDerived (0x0x7fd42c02d750 instance) in MixedVirtuallyDiamondDerived 

MixedVirtuallyDiamondDerived::_ZTC28MixedVirtuallyDiamondDerived0_16VirtuallyDerived: 8u entries 

0  0u 

8  0u 

16 0u 

24 (int (*)(...))0 

32 (int (*)(...))(& _ZTI16VirtuallyDerived) 

40 0u 

48 0u 

56 (int (*)(...))VirtuallyDerived::f 


Construction vtable for MixedVirtuallyDerived (0x0x7fd42c0b5380 instance) in MixedVirtuallyDiamondDerived 

MixedVirtuallyDiamondDerived::_ZTC28MixedVirtuallyDiamondDerived8_21MixedVirtuallyDerived: 13u entries 

0  18446744073709551608u 

8  (int (*)(...))0 

16 (int (*)(...))(& _ZTI21MixedVirtuallyDerived) 

24 0u 

32 0u 

40 (int (*)(...))OtherBase::g 

48 0u 

56 8u 

64 (int (*)(...))8 

72 (int (*)(...))(& _ZTI21MixedVirtuallyDerived) 

80 0u 

88 0u 

96 (int (*)(...))__cxa_pure_virtual 


VTT for MixedVirtuallyDiamondDerived 

MixedVirtuallyDiamondDerived::_ZTT28MixedVirtuallyDiamondDerived: 7u entries 

0  ((& MixedVirtuallyDiamondDerived::_ZTV28MixedVirtuallyDiamondDerived) + 40u) 

8  ((& MixedVirtuallyDiamondDerived::_ZTC28MixedVirtuallyDiamondDerived0_16VirtuallyDerived) + 40u) 

16 ((& MixedVirtuallyDiamondDerived::_ZTC28MixedVirtuallyDiamondDerived0_16VirtuallyDerived) + 40u) 

24 ((& MixedVirtuallyDiamondDerived::_ZTC28MixedVirtuallyDiamondDerived8_21MixedVirtuallyDerived) + 24u) 

32 ((& MixedVirtuallyDiamondDerived::_ZTC28MixedVirtuallyDiamondDerived8_21MixedVirtuallyDerived) + 80u) 

40 ((& MixedVirtuallyDiamondDerived::_ZTV28MixedVirtuallyDiamondDerived) + 40u) 

48 ((& MixedVirtuallyDiamondDerived::_ZTV28MixedVirtuallyDiamondDerived) + 96u) 


Class MixedVirtuallyDiamondDerived 

    size=16 align=8 

    base size=16 base align=8 

MixedVirtuallyDiamondDerived (0x0x7fd42c0b5310) 0 

    vptridx=0u vptr=((& MixedVirtuallyDiamondDerived::_ZTV28MixedVirtuallyDiamondDerived) + 40u) 

    VirtuallyDerived (0x0x7fd42c02d750) 0 nearly-empty 

     primary-for MixedVirtuallyDiamondDerived (0x0x7fd42c0b5310) 

     subvttidx=8u 

    Base (0x0x7fd42c035d20) 0 nearly-empty virtual 

     primary-for VirtuallyDerived (0x0x7fd42c02d750) 

     vptridx=40u vbaseoffset=-40 

    MixedVirtuallyDerived (0x0x7fd42c0b5380) 8 nearly-empty 

     subvttidx=24u vptridx=48u vptr=((& MixedVirtuallyDiamondDerived::_ZTV28MixedVirtuallyDiamondDerived) + 96u) 

    Base (0x0x7fd42c035d20) alternative-path 

    OtherBase (0x0x7fd42c035d80) 8 nearly-empty 

     primary-for MixedVirtuallyDerived (0x0x7fd42c0b5380) 


Vtable for VirtuallyMultiplyDerived 

VirtuallyMultiplyDerived::_ZTV24VirtuallyMultiplyDerived: 16u entries 

0  8u 

8  0u 

16 0u 

24 0u 

32 (int (*)(...))0 

40 (int (*)(...))(& _ZTI24VirtuallyMultiplyDerived) 

48 0u 

56 0u 

64 (int (*)(...))__cxa_pure_virtual 

72 0u 

80 18446744073709551608u 

88 (int (*)(...))-8 

96 (int (*)(...))(& _ZTI24VirtuallyMultiplyDerived) 

104 0u 

112 0u 

120 (int (*)(...))OtherBase::g 


VTT for VirtuallyMultiplyDerived 

VirtuallyMultiplyDerived::_ZTT24VirtuallyMultiplyDerived: 3u entries 

0  ((& VirtuallyMultiplyDerived::_ZTV24VirtuallyMultiplyDerived) + 48u) 

8  ((& VirtuallyMultiplyDerived::_ZTV24VirtuallyMultiplyDerived) + 48u) 

16 ((& VirtuallyMultiplyDerived::_ZTV24VirtuallyMultiplyDerived) + 104u) 


Class VirtuallyMultiplyDerived 

    size=16 align=8 

    base size=8 base align=8 

VirtuallyMultiplyDerived (0x0x7fd42c0b59a0) 0 nearly-empty 

    vptridx=0u vptr=((& VirtuallyMultiplyDerived::_ZTV24VirtuallyMultiplyDerived) + 48u) 

    Base (0x0x7fd42c035e40) 0 nearly-empty virtual 

     primary-for VirtuallyMultiplyDerived (0x0x7fd42c0b59a0) 

     vptridx=8u vbaseoffset=-40 

    OtherBase (0x0x7fd42c035ea0) 8 nearly-empty virtual 

     vptridx=16u vbaseoffset=-48 vptr=((& VirtuallyMultiplyDerived::_ZTV24VirtuallyMultiplyDerived) + 104u) 


Vtable for OtherVirtuallyMultiplyDerived 

OtherVirtuallyMultiplyDerived::_ZTV29OtherVirtuallyMultiplyDerived: 16u entries 

0  8u 

8  0u 

16 0u 

24 0u 

32 (int (*)(...))0 

40 (int (*)(...))(& _ZTI29OtherVirtuallyMultiplyDerived) 

48 0u 

56 0u 

64 (int (*)(...))__cxa_pure_virtual 

72 0u 

80 18446744073709551608u 

88 (int (*)(...))-8 

96 (int (*)(...))(& _ZTI29OtherVirtuallyMultiplyDerived) 

104 0u 

112 0u 

120 (int (*)(...))OtherBase::g 


VTT for OtherVirtuallyMultiplyDerived 

OtherVirtuallyMultiplyDerived::_ZTT29OtherVirtuallyMultiplyDerived: 3u entries 

0  ((& OtherVirtuallyMultiplyDerived::_ZTV29OtherVirtuallyMultiplyDerived) + 48u) 

8  ((& OtherVirtuallyMultiplyDerived::_ZTV29OtherVirtuallyMultiplyDerived) + 48u) 

16 ((& OtherVirtuallyMultiplyDerived::_ZTV29OtherVirtuallyMultiplyDerived) + 104u) 


Class OtherVirtuallyMultiplyDerived 

    size=16 align=8 

    base size=8 base align=8 

OtherVirtuallyMultiplyDerived (0x0x7fd42c0b5d90) 0 nearly-empty 

    vptridx=0u vptr=((& OtherVirtuallyMultiplyDerived::_ZTV29OtherVirtuallyMultiplyDerived) + 48u) 

    Base (0x0x7fd42c035f00) 0 nearly-empty virtual 

     primary-for OtherVirtuallyMultiplyDerived (0x0x7fd42c0b5d90) 

     vptridx=8u vbaseoffset=-40 

    OtherBase (0x0x7fd42c035f60) 8 nearly-empty virtual 

     vptridx=16u vbaseoffset=-48 vptr=((& OtherVirtuallyMultiplyDerived::_ZTV29OtherVirtuallyMultiplyDerived) + 104u) 


Vtable for MultiplyVirtuallyDiamondDerived 

MultiplyVirtuallyDiamondDerived::_ZTV31MultiplyVirtuallyDiamondDerived: 26u entries 

0  16u 

8  0u 

16 0u 

24 0u 

32 (int (*)(...))0 

40 (int (*)(...))(& _ZTI31MultiplyVirtuallyDiamondDerived) 

48 (int (*)(...))MultiplyVirtuallyDiamondDerived::~MultiplyVirtuallyDiamondDerived 

56 (int (*)(...))MultiplyVirtuallyDiamondDerived::~MultiplyVirtuallyDiamondDerived 

64 (int (*)(...))MultiplyVirtuallyDiamondDerived::f 

72 (int (*)(...))MultiplyVirtuallyDiamondDerived::g 

80 8u 

88 18446744073709551608u 

96 18446744073709551608u 

104 18446744073709551608u 

112 (int (*)(...))-8 

120 (int (*)(...))(& _ZTI31MultiplyVirtuallyDiamondDerived) 

128 (int (*)(...))MultiplyVirtuallyDiamondDerived::_ZThn8_N31MultiplyVirtuallyDiamondDerivedD1Ev 

136 (int (*)(...))MultiplyVirtuallyDiamondDerived::_ZThn8_N31MultiplyVirtuallyDiamondDerivedD0Ev 

144 0u 

152 18446744073709551600u 

160 18446744073709551600u 

168 (int (*)(...))-16 

176 (int (*)(...))(& _ZTI31MultiplyVirtuallyDiamondDerived) 

184 (int (*)(...))MultiplyVirtuallyDiamondDerived::_ZTv0_n24_N31MultiplyVirtuallyDiamondDerivedD1Ev 

192 (int (*)(...))MultiplyVirtuallyDiamondDerived::_ZTv0_n24_N31MultiplyVirtuallyDiamondDerivedD0Ev 

200 (int (*)(...))MultiplyVirtuallyDiamondDerived::_ZTv0_n32_N31MultiplyVirtuallyDiamondDerived1gEv 


Construction vtable for VirtuallyMultiplyDerived (0x0x7fd42bcdf230 instance) in MultiplyVirtuallyDiamondDerived 

MultiplyVirtuallyDiamondDerived::_ZTC31MultiplyVirtuallyDiamondDerived0_24VirtuallyMultiplyDerived: 16u entries 

0  16u 

8  0u 

16 0u 

24 0u 

32 (int (*)(...))0 

40 (int (*)(...))(& _ZTI24VirtuallyMultiplyDerived) 

48 0u 

56 0u 

64 (int (*)(...))__cxa_pure_virtual 

72 0u 

80 18446744073709551600u 

88 (int (*)(...))-16 

96 (int (*)(...))(& _ZTI24VirtuallyMultiplyDerived) 

104 0u 

112 0u 

120 (int (*)(...))OtherBase::g 


Construction vtable for OtherVirtuallyMultiplyDerived (0x0x7fd42bcdf2a0 instance) in MultiplyVirtuallyDiamondDerived 

MultiplyVirtuallyDiamondDerived::_ZTC31MultiplyVirtuallyDiamondDerived8_29OtherVirtuallyMultiplyDerived: 23u entries 

0  8u 

8  18446744073709551608u 

16 18446744073709551608u 

24 0u 

32 (int (*)(...))0 

40 (int (*)(...))(& _ZTI29OtherVirtuallyMultiplyDerived) 

48 0u 

56 0u 

64 (int (*)(...))__cxa_pure_virtual 

72 0u 

80 8u 

88 (int (*)(...))8 

96 (int (*)(...))(& _ZTI29OtherVirtuallyMultiplyDerived) 

104 0u 

112 0u 

120 (int (*)(...))__cxa_pure_virtual 

128 0u 

136 18446744073709551608u 

144 (int (*)(...))-8 

152 (int (*)(...))(& _ZTI29OtherVirtuallyMultiplyDerived) 

160 0u 

168 0u 

176 (int (*)(...))OtherBase::g 


VTT for MultiplyVirtuallyDiamondDerived 

MultiplyVirtuallyDiamondDerived::_ZTT31MultiplyVirtuallyDiamondDerived: 10u entries 

0  ((& MultiplyVirtuallyDiamondDerived::_ZTV31MultiplyVirtuallyDiamondDerived) + 48u) 

8  ((& MultiplyVirtuallyDiamondDerived::_ZTC31MultiplyVirtuallyDiamondDerived0_24VirtuallyMultiplyDerived) + 48u) 

16 ((& MultiplyVirtuallyDiamondDerived::_ZTC31MultiplyVirtuallyDiamondDerived0_24VirtuallyMultiplyDerived) + 48u) 

24 ((& MultiplyVirtuallyDiamondDerived::_ZTC31MultiplyVirtuallyDiamondDerived0_24VirtuallyMultiplyDerived) + 104u) 

32 ((& MultiplyVirtuallyDiamondDerived::_ZTC31MultiplyVirtuallyDiamondDerived8_29OtherVirtuallyMultiplyDerived) + 48u) 

40 ((& MultiplyVirtuallyDiamondDerived::_ZTC31MultiplyVirtuallyDiamondDerived8_29OtherVirtuallyMultiplyDerived) + 104u) 

48 ((& MultiplyVirtuallyDiamondDerived::_ZTC31MultiplyVirtuallyDiamondDerived8_29OtherVirtuallyMultiplyDerived) + 160u) 

56 ((& MultiplyVirtuallyDiamondDerived::_ZTV31MultiplyVirtuallyDiamondDerived) + 48u) 

64 ((& MultiplyVirtuallyDiamondDerived::_ZTV31MultiplyVirtuallyDiamondDerived) + 184u) 

72 ((& MultiplyVirtuallyDiamondDerived::_ZTV31MultiplyVirtuallyDiamondDerived) + 128u) 


Class MultiplyVirtuallyDiamondDerived 

    size=24 align=8 

    base size=16 base align=8 

MultiplyVirtuallyDiamondDerived (0x0x7fd42bcdf1c0) 0 

    vptridx=0u vptr=((& MultiplyVirtuallyDiamondDerived::_ZTV31MultiplyVirtuallyDiamondDerived) + 48u) 

    VirtuallyMultiplyDerived (0x0x7fd42bcdf230) 0 nearly-empty 

     primary-for MultiplyVirtuallyDiamondDerived (0x0x7fd42bcdf1c0) 

     subvttidx=8u 

    Base (0x0x7fd42bce2000) 0 nearly-empty virtual 

     primary-for VirtuallyMultiplyDerived (0x0x7fd42bcdf230) 

     vptridx=56u vbaseoffset=-40 

    OtherBase (0x0x7fd42bce2060) 16 nearly-empty virtual 

     vptridx=64u vbaseoffset=-48 vptr=((& MultiplyVirtuallyDiamondDerived::_ZTV31MultiplyVirtuallyDiamondDerived) + 184u) 

    OtherVirtuallyMultiplyDerived (0x0x7fd42bcdf2a0) 8 nearly-empty 

     lost-primary 

     subvttidx=32u vptridx=72u vptr=((& MultiplyVirtuallyDiamondDerived::_ZTV31MultiplyVirtuallyDiamondDerived) + 128u) 

    Base (0x0x7fd42bce2000) alternative-path 

    OtherBase (0x0x7fd42bce2060) alternative-path