我正在尝试使用gdb打印对象的vtable; 我找到了
show print vt bl on
Run Code Online (Sandbox Code Playgroud)
设置,但我实际上还不知道如何打印vtable - p*对象仍然不打印出来.
如何打印vtable?
是否有转换结构/类g++的成员变量的标志或工具?为了说明,请考虑这样的源代码
struct A { virtual void m() {}; };
struct B : public A { int b; virtual void n() = 0; };
struct C : public B { int c1, c2; void o(); };
struct D : public C { virtual void n() {}; A d; };
Run Code Online (Sandbox Code Playgroud)
我想得到类似的东西
A: 0 = (vptr)
B: 0 = (vptr)
4 = b
C: 0 = (vptr)
4 = b
8 = c1
12 = c2
D: 0 = …Run Code Online (Sandbox Code Playgroud) 有没有办法使用g ++编译器或任何其他方法打印C++对象的布局.一个简化的例子(假设int需要4个字节)
class A{
int a;
};
class B:public A{
int b;
}
Run Code Online (Sandbox Code Playgroud)
所以输出就是
A-
0 4
+ a +
B-
0 4 8
+ A.a + b +
Run Code Online (Sandbox Code Playgroud)
理解对象的布局(在我的例子中是虚拟机代码)会很有用.
提前致谢.
问候,扎赫尔
哪个虚拟表将是纯虚函数?在基类或派生类中?
例如,每个类中的虚拟表是什么样的?
class Base {
virtual void f() =0;
virtual void g();
}
class Derived: public Base{
virtual void f();
virtual void g();
}
Run Code Online (Sandbox Code Playgroud) 我正在将开发转移到Linux但我无法找到如何在g ++或clang ++下从MSVC++获得类似于/ d1reportSingleClassLayout的输出.如果这些编译器没有这样的功能,是否有提供类似可视化的外部工具?
使用 g++ 编译时,-fdump-class-hierarchy 以(或多或少)人类可读格式导出程序的虚表。但是,生成的文件仅包含有关 vtable 的信息,而不包含有关类布局本身的信息。我想获得我所有程序类的布局的完整列表。
clang 提供 -cc1 -fdump-record-layouts 参数来实现这一点。可以使用 -d1reportAllClassLayout 调用 MS 编译器。是否有任何 g++ 开关可以做到这一点?