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