9

重複の可能性:
vtable エントリを理解する

g++ バージョン 4.6.3、64 ビット マシンを使用します。コンパイラが自由に仮想関数を自由に実装できることは知っています。ここで何が起こったのか知りたいです。

私のクラス:

#include <iostream>
class test
{
    public:
    virtual void func(){std::cout<<"in class test";}
};

int main()
{
    test obj;
    obj.func();
    return 0;
}

コンパイラが生成した仮想テーブルを見ると、

Vtable for test
test::_ZTV4test: 3u entries
0     (int (*)(...))0 (<---- what is this? )
8     (int (*)(...))(& _ZTI4test)
16    (int (*)(...))test::func

オフセット 8 では RTTI です

オフセット 16 は、仮想機能のエントリです。

私の質問は、オフセット 0 に NULL のエントリがあるのはなぜですか、つまり、最初のエントリの目的は何ですか?

PS これはアラインメントに関連している可能性があると考えましたが、仮想関数を追加しましたが、RTTI エントリはまだオフセット 8 にありました。

4

1 に答える 1

8

最初のエントリまたは 0 のエントリは、トップ ポインタへのオフセットであると思います。

次の関連するスタックオーバーフローの質問を参照してください

ソースコードから残りの -fdump-class-hierarchy を見ると、ほとんどのクラスは(int (*)(...))0最初のエントリがストリームの C++ STL クラス階層が与えられた親クラスへのオフセット。

関連する質問では、いくつかの vtable の例への無効なリンクが示されています。そのリンクのライブ バージョンはここで利用できると思います

vtables の構造を詳しく説明している別の有用なリソースは、こちらです。

于 2012-10-27T13:40:49.137 に答える