【问题标题】:Compiler and v-table编译器和 v-table
【发布时间】:2018-01-29 10:10:47
【问题描述】:

我知道虚函数和动态多态是如何工作的。我知道编译器会在基类中添加一个 v-ptr,它将被后续的派生类继承。此外,编译器将为每个类创建 v-tables,并将保留与每个类相关的大多数派生版本的虚函数的函数指针。

现在,我的问题是这个 v-table 存储在哪里?它在代码段中吗?从哪里为这些表分配内存。请分享内部细节。

我也知道实现可能会因一种编译器而异。但是可以在他/她的回答中提到一个特定的编译器和特定于该编译器的实现。

【问题讨论】:

  • 如果您没有指定编译器,我们如何共享“内部细节”?这都是一个实现细节。我会给你一个流行的,但仍然依赖于编译器,而不是单独由语言强制。
  • ...这是“太宽泛”了吗?
  • john 编译器(我脑海中存在的那个)将 vtable 存储在数据段中(毕竟是数据)并静态分配内存(毕竟它是在编译时固定的)。
  • @StoryTeller 我已经在我的问题中提到,可以提及任何编译器名称和相应的实现。
  • 为什么不在您关心并有权访问的编译器中构建一个玩具项目,然后看看?您可以检查符号表和/或反编译新表达式代码以找出答案。

标签: c++ polymorphism virtual vtable


【解决方案1】:

确实,这取决于编译器和平台。 Linux 上的 GCC 将它们放在 ELF 文件的 .rodata 段中。 Visual C++ 将它们放在 EXE/DLL 文件的.rdata 段中。

在这两种情况下,内存都没有分配到任何地方,它是从执行文件映射的内存,就像代码一样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-10
    • 1970-01-01
    • 2021-07-12
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-13
    相关资源
    最近更新 更多