Vテーブルはいつクラス用に作成されますか?
-
26-09-2019 - |
質問
仮想関数コール解像度を実装する方法は、C ++スタンドラッドの一部ではなく、VPTRやVテーブルについては何も述べていませんが、ここでこの質問をしてみましょう。
Vテーブルは、コンパイラが仮想関数呼び出し解像度を実装するために使用する一般的な手法であると聞いています。これについての私の理解は、クラスごとに、プロセスごとに仮想テーブルのみが必要であることです。
私が疑問に思っているのは、Vテーブルがクラス用に作成されるのはいつですか?
特定のタイプのクラス(Vテーブルが必要な)がプロセススペースで初めて作成されるときですか?
その後、そのプロセス空間でそのタイプのオブジェクトを作成したすべてのオブジェクトは、すでに作成されているVテーブルを指しますか?
このVテーブルはいつ削除されますか?
これがあまりにも主観的であるか、議論の種類の質問である場合は申し訳ありませんが、これらの質問はしばらく心に残り、ここで尋ねても大丈夫だと感じています。
解決
Vテーブルは静的に割り当てられており、削除されることはなく、明示的に割り当てられていません。特定の特定のオブジェクト内のポインターは定数です。
他のヒント
C ++ FAQ Vtableメカニズムの簡略化された説明を提供します。詳細については、おそらく特定のコンパイラドキュメントを実行する必要がありますが、読む必要があります。
私の観点から最も重要なアイデア:
- タイプのvtableは静的で、コンパイル時に構築されています
- 各タイプインスタンスにはaが含まれます ポインター このテーブルに
- このポインターは建設時に初期化されているため、仮想メンバー関数をコンストラクターから呼び出すべきではありません
Vtableは静的データであるため、Loadですぐに使用できます。ところで、それは通常、クラス上の最初の非インライン仮想関数の定義を含むコンパイルユニットにバンドルされています(そして、インラインの仮想関数が1つしかない場合、ヒューリスティックは問題につながります)。
すべての実装が定義されていると思うので、この質問に対して普遍的な答えを出すのは難しいです。 Vtableは、ある種の静的クラスメンバーであるべきだと思います。