【问题标题】:Virtual Table layout in memory?内存中的虚拟表布局?
【发布时间】:2009-08-27 16:11:49
【问题描述】:

虚拟表是如何存储在内存中的?他们的布局?

例如

class A{
    public:
         virtual void doSomeWork();
};

class B : public A{
    public:
         virtual void doSomeWork();
};

A类和B类的虚表在内存中的布局会怎样?

【问题讨论】:

标签: c++ vtable


【解决方案1】:

对于 Linux 中的 GCC 编译器运行:

g++ -fdump-class-hierarchy example.h

输出是:

A 的 Vtable A::_ZTV1A: 3u 条目 0 (int (*)(...))0 8 (int (*)(...))(& _ZTI1A) 16 (int (*)(...))A::doSomeWork A级 大小=8 对齐=8 基本尺寸=8 基本对齐=8 A (0x7fb76785a4e0) 0 几乎为空 vptr=((& A::_ZTV1A) + 16u) B 的 Vtable B::_ZTV1B: 3u 个条目 0 (int (*)(...))0 8 (int (*)(...))(& _ZTI1B) 16 (int (*)(...))B::doSomeWork B类 大小=8 对齐=8 基本尺寸=8 基本对齐=8 B (0x7fb7678510d0) 0 几乎为空 vptr=((& B::_ZTV1B) + 16u) A (0x7fb76785a540) 0 几乎为空 主要用于 B (0x7fb7678510d0)

我还创建了vtable-dumper 工具来列出共享对象中虚拟表的内容。使用此工具,您无需编译标头,只需在对象上运行即可:

vtable-dumper SHLIB

【讨论】:

  • 虽然这个答案没有指出布局没有标准化,但它显然是最好的,因为它展示了一种从编译器学习的简单方法,它的对象布局模型。谢谢!
  • BTW 不要从字面上理解(int (*)(...)),它是一个占位符类型!
【解决方案2】:

正如其他人所说,这取决于编译器,而不是您在日常使用 C++ 时真正需要考虑的事情。但是,如果您只是对这个问题感到好奇,您应该阅读 Stan Lippman 的书Inside the C++ Object Model

【讨论】:

    【解决方案3】:

    内存中的vtable布局完全依赖于编译器;没有采取“正确”或通用的方法。

    【讨论】:

    【解决方案4】:

    正如其他人已经写的那样,没有通用的方法。 (见鬼,甚至没有人强制使用虚拟表。)

    但是,我相信它们最有可能实现为对象中某个偏移量处的隐藏指针,该对象引用函数指针表。某些虚函数的地址占据该表中的某些偏移量。通常还有一个指向动态类型的std::type_info 对象的指针。

    如果您对此类内容感兴趣,请阅读Lippmann's "Inside the C++ Object Model"。然而,除非你的兴趣是学术性的(或者你正在尝试编写一个 C++ 编译器——但你不应该问),你不应该打扰。这是一个你不需要知道也不应该依赖的实现细节。

    【讨论】:

      【解决方案5】:

      来自wikipedia

      C++ 标准不强制要求 究竟应该如何动态调度 实施

      所以答案是否定的。 vtable 的布局由实现定义。

      【讨论】:

      • “答案是否定的”?这不是一个是/否的问题。
      • 我会说,考虑到“内存中的虚拟表布局?”,这可以接受不同的意见。 :)
      • "vtable 的布局是实现定义的" 不。许多实现没有定义 vtables 的结构,标准也没有说明 vtables 的任何内容,甚至没有他们必须存在。该标准甚至没有提到 vtable,因此它们不能是“实现定义的”。
      【解决方案6】:

      有关Open Watcom 的类布局的非常详细的描述,请查看Class Layout 注释

      【讨论】:

        猜你喜欢
        • 2012-07-21
        • 2015-09-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-30
        • 2021-04-02
        • 1970-01-01
        • 2012-01-07
        相关资源
        最近更新 更多