仮想関数は常にポインターのサイズをオブジェクトに追加しますか?

Barbara Streisand
リリース: 2024-11-04 10:02:30
オリジナル
593 人が閲覧しました

Do Virtual Functions Always Add the Size of a Pointer to an Object?

代替仮想関数呼び出しの実装

C では、仮想メカニズムを通じて動的バインディングが容易になります。標準では仮想関数呼び出しの予期される動作が指定されていますが、具体的な実装はコンパイラによって異なります。仮想テーブルと仮想ポインタのメカニズムは、G や Microsoft Visual Studio などのコンパイラで広く採用されています。

代替実装

仮想テーブル アプローチの普及にもかかわらず、その他の仮想関数の動的ディスパッチの実装は存在します。既知の代替案の 1 つは、仮想ポインタの代わりにオブジェクト内ポインタを使用することを伴います。この戦略により、配列内のすべてのオブジェクトに対してマッピング テーブル内の 1 つのエントリだけが必要となるため、複数のベースと配列を持つ複雑なオブジェクトをより効率的に処理できます。

オブジェクトのサイズと仮想関数

仮想関数を持つクラスのサイズが常にポインター (仮想ポインター) のサイズと等しいという記述は、普遍的に真実ではありません。仮想関数ディスパッチの実際の実装は、オブジェクトのサイズに影響を与える可能性があります。たとえば、上記の代替実装では、オブジェクト内ポインタに追加のストレージが必要となるため、仮想関数を持つオブジェクトのサイズがポインタのサイズを超える可能性があります。

の制限事項仮想テーブル

仮想テーブルは動的ディスパッチの一般的なソリューションですが、制限もあります。たとえば、これらを使用すると、特に複数のベースを持つ複雑なミックスイン オブジェクトの場合、vtable が大きくなり、オブジェクトの初期化が遅くなる可能性があります。この結果は、サブオブジェクトの実行時の型は、構築中であっても常に正しくなければならないという要件から生じます。

代替データ構造

これらを克服する 1 つのアプローチ制限は、メタデータを保存するために代替データ構造を使用することです。たとえば、Judy 配列は、オブジェクト アドレスとそれに対応するメタデータ間の非常に効率的なマッピングを作成するために使用されています。このアプローチにより、高速な検索と適度なストレージ要件が実現します。

以上が仮想関数は常にポインターのサイズをオブジェクトに追加しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!