代替仮想関数呼び出しの実装
C では、仮想メカニズムを通じて動的バインディングが容易になります。標準では仮想関数呼び出しの予期される動作が指定されていますが、具体的な実装はコンパイラによって異なります。仮想テーブルと仮想ポインタのメカニズムは、G や Microsoft Visual Studio などのコンパイラで広く採用されています。
代替実装
仮想テーブル アプローチの普及にもかかわらず、その他の仮想関数の動的ディスパッチの実装は存在します。既知の代替案の 1 つは、仮想ポインタの代わりにオブジェクト内ポインタを使用することを伴います。この戦略により、配列内のすべてのオブジェクトに対してマッピング テーブル内の 1 つのエントリだけが必要となるため、複数のベースと配列を持つ複雑なオブジェクトをより効率的に処理できます。
オブジェクトのサイズと仮想関数
仮想関数を持つクラスのサイズが常にポインター (仮想ポインター) のサイズと等しいという記述は、普遍的に真実ではありません。仮想関数ディスパッチの実際の実装は、オブジェクトのサイズに影響を与える可能性があります。たとえば、上記の代替実装では、オブジェクト内ポインタに追加のストレージが必要となるため、仮想関数を持つオブジェクトのサイズがポインタのサイズを超える可能性があります。
の制限事項仮想テーブル
仮想テーブルは動的ディスパッチの一般的なソリューションですが、制限もあります。たとえば、これらを使用すると、特に複数のベースを持つ複雑なミックスイン オブジェクトの場合、vtable が大きくなり、オブジェクトの初期化が遅くなる可能性があります。この結果は、サブオブジェクトの実行時の型は、構築中であっても常に正しくなければならないという要件から生じます。
代替データ構造
これらを克服する 1 つのアプローチ制限は、メタデータを保存するために代替データ構造を使用することです。たとえば、Judy 配列は、オブジェクト アドレスとそれに対応するメタデータ間の非常に効率的なマッピングを作成するために使用されています。このアプローチにより、高速な検索と適度なストレージ要件が実現します。
以上が仮想関数は常にポインターのサイズをオブジェクトに追加しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。