4

c++クラスの仮想関数テーブルがどこに格納されるかを正確に見つけようとしました。「関数ポインタの静的配列」のようないくつかの答えを見つけたので、データセグメントの読み取り専用メモリに格納されますか?(初期化されたもの)

4

3 に答える 3

2

おそらくそうです。ただし、義務付けられたものではありません。仮想関数テーブルを介してポリモーフィズムを実装することさえ義務付けられていませんが、ほとんどのプラットフォームでは実装されています。これらは実装の詳細です。コンパイラが標準によって設定された動作に従う限り、必要なことは何でも実行できます。

Avftableはクラスごとに 1 つで、メモリ内の 1 つの場所にのみ格納されます。

于 2012-04-30T17:15:45.073 に答える
1

関数を仮想化すると、コンパイラはクラス内に vptr を挿入します。その結果、クラスのサイズが 4 バイト増加します (Win32 の場合)。このポインターは、仮想テーブル (vtable) のアドレスを保持します。vtable はコンパイル時にコンパイラによって構築され、基本的に関数ポインタの配列に過ぎません。関数ポインターは、実際にはその特定のクラスの仮想関数へのポインターです。より正確には、仮想テーブルは関数ポインターの静的配列であるため、同じクラスの異なるインスタンスがその vtable を共有できます。静的メンバーはデータ セクション (.data) に格納されるため、vtable も実行可能ファイルのデータ セクションに格納されます。

于 2012-04-30T17:16:04.183 に答える