仮想ポインタと仮想テーブルメカニズム以外の方法で仮想メカニズムを実装するコンパイラはありますか?私が見た限りでは(g ++を読んで、Microsoft Visual Studio)、仮想テーブル、ポインターメカニズムを介して実装しています。それで、実際には他のコンパイラ実装はありますか?
私が知っている現在のすべてのコンパイラは、vtableメカニズムを使用しています。
これは、C++が静的に型チェックされるために可能な最適化です。
いくつかのより動的な言語では、代わりに基本クラスチェーンの動的検索があり、オブジェクトの最も派生したクラスから開始して、仮想的に呼び出されるメンバー関数の実装を検索します。たとえば、それが元のSmalltalkでどのように機能したかです。また、C ++標準では、そのような検索が使用されたかのように仮想呼び出しの効果が記述されています。
1990年代のBorland/Turbo Pascalでは、このような動的検索がWindowsAPIの「ウィンドウメッセージ」のハンドラーを見つけるために採用されました。そして、おそらくBorlandC++でも同じだと思います。これは通常のvtableメカニズムに追加され、メッセージハンドラーにのみ使用されていました。
Borland / Turbo C ++で使用された場合(覚えていませんが)、メッセージIDをメッセージハンドラー関数に関連付けることができる言語拡張機能がサポートされていました。
仮想関数のみを持つクラスのsizeofは、そのコンパイラー上のポインター(this内のvptr)のサイズになります。したがって、仮想ptrおよびtblメカニズム自体がコンパイラーの実装であるとすると、上記のステートメントは常に真になりますか?
正式にはありません(vtableメカニズムを想定している場合でも)、コンパイラに依存します。標準はvtableメカニズムを必要としないため、各オブジェクトへのvtableポインターの配置については何も述べていません。また、他のルールにより、コンパイラーは最後にパディング、未使用バイトを自由に追加できます。
しかし実際にはおそらく。;-)
しかし、それはあなたが頼るべきものでも、あなたが頼る必要があるものでもありません。ただし、他の方向では、たとえばABIを定義している場合など、これを要求できます。そうしないと、単にあなたの要件に適合しないコンパイラがあります。
乾杯&hth。、