我想学习C++类中的内存模块(如vtable、vptr...) 我使用“g++ -fdump-lang-class”生成一个 .class 文件来显示类内存。
测试代码如下:
class A {
public:
void func() {}
private:
int a;
};
class B : public A {
public:
void func() {}
private:
int b;
int c;
};
并且 .class 文件显示:
Class A
size=4 align=4
base size=4 base align=4
A (0x0x7f3a29771ae0) 0
Class B
size=12 align=4
base size=12 base align=4
B (0x0x7f3a296201a0) 0
A (0x0x7f3a29771ba0) 0
我想知道A类中的“A(0x0x7f3a29771ae0)0”和B类中的“A(0x0x7f3a29771ba0)0”的含义。
“0x0x...”和“0”是什么?为什么两个A不同?
从 g++ -fdump-lang-class 命令提供的输出与类的虚拟表 (vtable) 信息相关。我们来分解一下信息:
对于A类:
Class A
size=4 align=4
base size=4 base align=4
A (0x0x7f3a29771ae0) 0
size=4和align=4表示尺寸和对齐要求 A 级。
base size=4 basealign=4表示base的大小和对齐方式 类(在本例中为 A 本身)。
A (0x0x7f3a29771ae0) 0代表A类的虚表:
对于B类:
Class B
size=12 align=4
base size=12 base align=4
B (0x0x7f3a296201a0) 0
A (0x0x7f3a29771ba0) 0
从 g++ -fdump-lang-class 命令提供的输出与类的虚拟表 (vtable) 信息相关。我们来分解一下信息:
对于A类:
阿杜伊诺 复制代码 A级 大小=4 对齐=4 基本尺寸=4 基本对齐=4 A (0x0x7f3a29771ae0) 0 size=4和align=4表示A类的大小和对齐要求。 base size=4 basealign=4 表示基类(在本例中为 A 本身)的大小和对齐方式。 A (0x0x7f3a29771ae0) 0代表A类的虚拟表: 0x0x7f3a29771ae0 是 A 类 vtable 的地址。 0 表示 vtable 内的偏移量。由于A类中没有虚函数,因此偏移量为0。 对于 B 类:
CSS 复制代码 B级 大小=12 对齐=4 基本尺寸=12 基本对齐=4 B (0x0x7f3a296201a0) 0 A (0x0x7f3a29771ba0) 0
不同的地址(0x0x7f3a29771ae0和0x0x7f3a29771ba0)表明A类中的A和B类中的A的vtable是不同的,因为它们可能具有不同的虚拟函数,或者由于B类中存在其他成员而在内存中布局不同. 0 偏移意味着您提供的代码中 A 类或 B 类中没有虚函数。