C/C++雜記:深刻虛表結構

1. 虛表與「虛函數表」

在「C/C++雜記:虛函數的實現的基本原理」一文中曾提到「虛函數表」的概念,只是爲了便於理解,事實是:虛函數表並不真的獨立存在,它只是虛表(virtual table)中的一部份內容。例:
html

從圖中可已看出,虛表除了包含虛函數指針,還包含其它一些信息(如:RTTI信息、偏移值等)。git

順便介紹一下gcc的-fdump-class-hierarchy選項,它能夠用於輸出C++程序的虛表結構(在當前目錄下生成一個.class文件),例:
github

2. 虛表結構

一個虛表包含如下幾個部分:
函數

其中:指針

  • 橙色線框中的內容僅限於虛擬繼承的情形(若無虛擬繼承,則無此內容),虛擬繼承的討論已超過了本文的範圍,暫且忽略。
  • 「offset to top」是指到對象起始地址的偏移值,只有多重繼承的情形纔有可能不爲0,單繼承或無繼承的情形都爲0。
  • 「RTTI information」是一個對象指針,它用於惟一地標識該類型。(注:本系列博文後續會有詳細討論。)
  • 「virtual function pointers」也就是咱們以前理解的虛函數表,其中存放着虛函數指針列表。

前一節的示例是單繼承的示例,下面列出了一個多繼承的示例:
orm

從中能夠看到:D的虛表中包含兩個虛表結構,第一個也稱之爲「主虛表」(primary virtual table),另外一個虛表又稱之爲「次虛表」(secondary virtual table)。htm

簡單地歸納一下:一個含有虛函數(不管是其自己的,仍是繼承而來的)的類,能夠有一個主虛表和多個次虛表,主虛表和次虛表構成一個虛表組(virtual table group)。對象

3. 參考

Itanium C++ ABIblog

相關文章
相關標籤/搜索