当前位置:  开发笔记 > 编程语言 > 正文

用于查看多重继承的内存布局的工具

如何解决《用于查看多重继承的内存布局的工具》经验,为你挑选了1个好方法。

有没有一个工具可以用来查看已编译的C++代码的多继承内存布局?



1> Johannes Sch..:

我不知道你究竟想知道什么.对于这个简单的例子

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的第二个条目分配一个空指针.很好,有趣的挖掘这些信息.

推荐阅读
Life一切安好
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有