有没有可以用来查看已编译的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的第二个条目分配一个空指针。很好,在这些信息中玩得开心。关于c++ - 使用哪个工具查看多重继承的内存布局,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/394650/