2009-07-20 68 views
2

使用gcc -fdump-class-hierarchy編譯下面的類什麼是「近乎空虛」的課程?

class Interface 
{ 
    virtual void doIt() = 0; 
    virtual ~Interface() = 0; 
}; 

inline Interface::~Interface() {} 

gcc發出

 
Class Interface 
    size=4 align=4 
    base size=4 base align=4 
Interface (0x1a779c0) 0 nearly-empty 
    vptr=((& Interface::_ZTV9Interface) + 8u) 

什麼是 「近空」 的意義是什麼?這是什麼意思?

+0

沒有關係,但..不要將虛擬析構函數作爲純粹的虛擬,因爲您正在提供實現。 – Naveen 2009-07-20 11:21:51

+4

我不認爲這是特別好的建議。純虛擬析構函數是說這個類是抽象類的常用簡寫,並且它們必須有一個實現。 – 2009-07-20 11:25:09

回答

4

C++ ABI提供的「近空」類的定義以及它們如何影響虛函數表建設一個有趣的討論:

包含虛擬指針,A級,但除了(可能)虛基類沒有其它數據。特別是,它:

  • 具有比零寬度位字段之外,沒有其他的非靜態數據成員,
  • 具有不或是空的,幾乎是空的,或虛擬沒有直接的基類,
  • 具有大多數是一個非虛擬的,幾乎空的直接基類,並且
  • 沒有適當的基類,它是空的,沒有道德上虛擬的,並且在零以外的偏移處。

我碰到這個同時跑的研究幾乎是空的虛基類的對象大小,虛函數表的大小,和虛擬調用開銷的影響。

3

它只有一個vtable,沒有數據字段。

6

我想這是區分它與「空」,這是你得到的,如果編譯一個沒有成員的類。 「幾乎空虛」似乎意味着它有一個虛擬的,沒有別的。

6

C++有一些叫做「空基優化」的東西。如果一個類沒有成員,當它用作基類時,不需要佔用空間。爲什麼這很重要的一個例子是std::unary_function<T, U>。它的存在是爲您提供一套簡單的typedefs。這些typedefs不應該影響你的函數類的大小。

如果你有一個帶有vtable指針的基類,這個指針可能與派生類共享。您只需爲派生類創建一個vtable,然後在基類之後添加自己的方法。

您現在可以實現類似的「無額外開銷」基類。 GCC顯然稱之爲「幾乎空洞」。