4

仮想関数呼び出しの解決を実装する方法は C++ 標準の一部ではなく、vptr または v-table についても何も述べていないことはわかっていますが、ここでこの質問をさせてください。

v-table は、コンパイラが仮想関数呼び出し解決を実装するために使用する一般的な手法であると聞いたことがあります。これについての私の理解は、クラスごと、プロセスごとに仮想テーブルのみが必要であるということです。

私が疑問に思っているのは、クラスの v テーブルが作成されるのはいつですか?
特定のタイプのクラス (v-table が必要) がプロセス空間で初めて作成されたときですか?
そのプロセス空間でその後作成されたそのタイプの他のすべてのオブジェクトは、すでに作成されている v-table を参照していますか?
この v-table はいつ削除されますか?

これがあまりにも主観的またはディスカッションタイプの質問である場合は申し訳ありませんが、これらの質問はしばらく頭に残り、ここで質問しても問題ないと思います.

4

4 に答える 4

7

v-table は静的に割り当てられ、削除されることも、明示的に割り当てられることもありません。特定のオブジェクト内のポインターは定数です。

于 2010-11-21T18:03:51.697 に答える
4

C++ FAQは、vtable メカニズムの簡単な説明を提供します。詳細については、おそらく特定のコンパイラのドキュメントを確認する必要がありますが、それを読む必要があります。

私の観点からの最も重要なアイデア:

  • 型の vtable は静的であり、コンパイル時に構築されます
  • 各型インスタンスには、このテーブルへのポインターが含まれています
  • このポインターは構築時に初期化されるため、コンストラクターから仮想メンバー関数を呼び出すことはできません。
于 2010-11-21T18:06:21.410 に答える
1

vtable は静的データであるため、ロード時にすぐに利用できます。ところで、それは通常、クラスの最初の非インライン仮想関数の定義を含むコンパイルユニットにバンドルされています(インラインの仮想関数が1つしかない場合、そのヒューリスティックは問題につながります)。

于 2010-11-21T18:04:27.393 に答える
0

すべて実装で定義されていると思いますので、この質問に普遍的な答えを出すのは困難です。vtable は、ある種の静的クラス メンバーであるべきだと思います。

于 2010-11-21T18:05:22.657 に答える