有没有一个工具可以用来查看已编译的C++代码的多继承内存布局?
我不知道你究竟想知道什么.对于这个简单的例子
class classA { }; class classB { }; class classC : public classA, public classB { }; $ g++ -fdump-class-hierarchy test.cpp
将以下内容输出到文件中 test.cpp.002t.class
Class classA size=1 align=1 base size=0 base align=1 classA (0xb7b06780) 0 empty Class classB size=1 align=1 base size=0 base align=1 classB (0xb7b067bc) 0 empty Class classC size=1 align=1 base size=1 base align=1 classC (0xb7a736e0) 0 empty classA (0xb7b067f8) 0 empty classB (0xb7b06834) 0 empty
有关详细信息,请参阅gcc联机帮助页.将classA更改为:
class classA { int aObj; virtual void aFun() { } };
突然弹出一张虚拟桌子:
Vtable for classA classA::_ZTV6classA: 3u entries 0 (int (*)(...))0 4 (int (*)(...))(& _ZTI6classA) 8 classA::aFun Class classA size=8 align=4 base size=8 base align=4 classA (0xb7b4d7f8) 0 vptr=((& classA::_ZTV6classA) + 8u) Class classB size=1 align=1 base size=0 base align=1 classB (0xb7b4d9d8) 0 empty Vtable for classC classC::_ZTV6classC: 3u entries 0 (int (*)(...))0 4 (int (*)(...))(& _ZTI6classC) 8 classA::aFun Class classC size=8 align=4 base size=8 base align=4 classC (0xb7aba820) 0 vptr=((& classC::_ZTV6classC) + 8u) classA (0xb7b4da14) 0 primary-for classC (0xb7aba820) classB (0xb7b4da50) 0 empty
看起来很奇怪(_ZTI6classA和_ZTI6classC和_ZTV6classC)实际上是指向为类创建的RTTI信息gcc的指针.使用-fno-rtti
显示它将为vtables的第二个条目分配一个空指针.很好,有趣的挖掘这些信息.