2

次のクラスをコンパイルします

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

inline Interface::~Interface() {}

を使用してgcc -fdump-class-hierarchy

gcc発する

クラス インターフェイス
   サイズ=4 整列=4
   base size=4 base align=4
インターフェイス (0x1a779c0) 0 ほとんど空
    vptr=((& インターフェイス::_ZTV9インターフェイス) + 8u)

「ほぼ空」の意味は何ですか?どういう意味ですか?

4

4 に答える 4

7

C++ には、「空のベースの最適化」と呼ばれるものがあります。クラスにメンバーがない場合、基底クラスとして使用するときにスペースを占有する必要はありません。これが重要である理由の例は、std::unary_function<T, U>. タイプ定義の簡単なセットを提供するために存在します。これらの typedef は、ファンクター クラスのサイズに影響を与えるべきではありません。

vtable ポインターを持つ基本クラスがある場合、このポインターは派生クラスと共有される可能性があります。基本クラスの後に独自のメソッドを追加する派生クラスの vtable を作成するだけです。

同様の「余分なオーバーヘッドがない」基本クラスを実現できるようになりました。どうやらGCCはそれを「ほぼ空」と呼んでいます。

于 2009-07-20T11:29:20.637 に答える
6

メンバーがまったくないクラスをコンパイルした場合に得られる「空」と区別するためだと思います。「ほぼ空」とは、vtable があり、他に何もないことを意味するようです。

于 2009-07-20T11:22:27.890 に答える
4

C ++ ABIは、「ほぼ空の」クラスの定義と、それらがvtableの構築にどのように影響するかについての興味深い議論を提供します。

仮想ポインタを含むが、(おそらく)仮想ベース以外の他のデータを含まないクラス。特に、それは:

  • ゼロ幅ビットフィールド以外の非静的データメンバーはありません。
  • 空、ほぼ空、または仮想のいずれでもない直接の基本クラスはありません。
  • 最大で1つの非仮想、ほぼ空の直接基本クラスがあり、
  • 空で、道徳的に仮想ではなく、ゼロ以外のオフセットにある適切な基本クラスがありません。

オブジェクトサイズ、vtableサイズ、および仮想呼び出しのオーバーヘッドに対するほぼ空の仮想ベースの影響を調査しているときに、これに遭遇しました。

于 2010-06-29T21:50:19.403 に答える
3

vtable のみがあり、データ フィールドはありません。

于 2009-07-20T11:17:56.323 に答える