如何解释“g++ -fdump-lang-class”命令生成的结果文件?

问题描述 投票:0回答:1

我想学习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不同?

c++ class gcc memory-management g++
1个回答
0
投票

从 g++ -fdump-lang-class 命令提供的输出与类的虚拟表 (vtable) 信息相关。我们来分解一下信息:

对于A类:

Class A
   size=4 align=4
   base size=4 base align=4
A (0x0x7f3a29771ae0) 0
  1. size=4和align=4表示尺寸和对齐要求 A 级。

  2. base size=4 basealign=4表示base的大小和对齐方式 类(在本例中为 A 本身)。

  3. A (0x0x7f3a29771ae0) 0代表A类的虚表:

    • 0x0x7f3a29771ae0 是 A 类 vtable 的地址。
    • 0 表示 vtable 内的偏移量。由于A类中没有虚函数,因此偏移量为0。

对于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

  • size=12和align=4表示B类的大小和对齐要求。
  • base size=12 basealign=4 表示的大小和对齐方式 基类 A.
  • B (0x0x7f3a296201a0) 0 代表 B 类的虚拟表:
    • 0x0x7f3a296201a0 是 B 类 vtable 的地址。
    • 0 表示 B 的 vtable 内的偏移量。因为没有 B类本身的虚函数,偏移量为0。
  • A (0x0x7f3a29771ba0) 0代表A类的子对象 B类:
    • 0x0x7f3a29771ba0 是 A 子对象的 vtable 地址 B 类内。
    • 0 代表 A 的 vtable 内的偏移量。同样,因为有 A 类中没有虚函数,偏移量为 0。

不同的地址(0x0x7f3a29771ae0和0x0x7f3a29771ba0)表明A类中的A和B类中的A的vtable是不同的,因为它们可能具有不同的虚拟函数,或者由于B类中存在其他成员而在内存中布局不同. 0 偏移意味着您提供的代码中 A 类或 B 类中没有虚函数。

© www.soinside.com 2019 - 2024. All rights reserved.