zoukankan      html  css  js  c++  java
  • 【转载】C/C++杂记:深入虚表结构

    原文:C/C++杂记:深入虚表结构

    1. 虚表与“虚函数表”

    在“C/C++杂记:虚函数的实现的基本原理”一文中曾提到“虚函数表”的概念,只是为了便于理解,事实是:虚函数表并不真的独立存在,它只是虚表(virtual table)中的一部分内容。例:

    从图中可已看出,虚表除了包含虚函数指针,还包含其它一些信息(如:RTTI信息、偏移值等)。

    顺便介绍一下gcc的-fdump-class-hierarchy选项,它可以用于输出C++程序的虚表结构(在当前目录下生成一个.class文件),例:

    2. 虚表结构

    一个虚表包含以下几个部分:

    其中:

    • 橙色线框中的内容仅限于虚拟继承的情形(若无虚拟继承,则无此内容),虚拟继承的讨论已超过了本文的范围,暂且忽略。
    • “offset to top”是指到对象起始地址的偏移值,只有多重继承的情形才有可能不为0,单继承或无继承的情形都为0。
    • “RTTI information”是一个对象指针,它用于唯一地标识该类型。(注:本系列博文后续会有详细讨论。)
    • “virtual function pointers”也就是我们之前理解的虚函数表,其中存放着虚函数指针列表。

    前一节的示例是单继承的示例,下面列出了一个多继承的示例:

    从中可以看到:D的虚表中包含两个虚表结构,第一个也称之为“主虚表”(primary virtual table),另一个虚表又称之为“次虚表”(secondary virtual table)。

    简单地概括一下:一个含有虚函数(无论是其本身的,还是继承而来的)的类,可以有一个主虚表和多个次虚表,主虚表和次虚表构成一个虚表组(virtual table group)。

    3. 参考

    Itanium C++ ABI

  • 相关阅读:
    洛谷—— P3353 在你窗外闪耀的星星
    洛谷—— P1238 走迷宫
    洛谷—— P1262 间谍网络
    9.8——模拟赛
    洛谷—— P1189 SEARCH
    算法
    May 22nd 2017 Week 21st Monday
    May 21st 2017 Week 21st Sunday
    May 20th 2017 Week 20th Saturday
    May 19th 2017 Week 20th Friday
  • 原文地址:https://www.cnblogs.com/zhehan54/p/5582136.html
Copyright © 2011-2022 走看看