• 【转载】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

  • 相关阅读:
    超实用的PHP代码片段
    推荐五款优秀的PHP代码重构工具
    PHP开发搜索引擎技术全解析
    怎样成为一名PHP专家?
    PHP中该怎样防止SQL注入?
    有关PHP 10条有用的建议
    fir.im Weekly
    可能是一场很 IN 的技术分享
    fir.im Weekly
    更新日志
  • 原文地址:https://www.cnblogs.com/zhehan54/p/5582136.html
Copyright © 2020-2023  润新知