私は、正確に仮想関数テーブルがC++クラスのどこに格納されるのかを調べようとしました。 私はそのような "関数ポインタの静的配列"のような答えを見つけました それはデータセグメントの読み取り専用メモリに格納されますか? (初期化されたもの)C++クラスの仮想関数テーブルはどこに格納されていますか?
2
A
答えて
2
おそらくはい。しかし、それは強制されていません。仮想ファンクションテーブルを介して多態性が実装されていることは必須ではありませんが、ほとんどのプラットフォームではそうです。これらは実装の詳細です。コンパイラが標準によって設定された動作に従う限り、必要なものは何でも実行できます。
vftable
はクラスごとに1つで、メモリ内の1つの場所にのみ格納されます。
1
仮想関数を作成すると、コンパイラはクラス内にvptrを挿入します。その結果、クラスのサイズは4バイト(Win32上)に増加します。このポインタは仮想テーブル(vtable)のアドレスを保持します。 vtableはコンパイル時にコンパイラによって構築され、基本的には関数ポインタの配列にすぎません。関数ポインタは実際にその特定のクラスの仮想関数へのポインタです。より正確には、仮想テーブルは関数ポインタの静的な配列なので、同じクラスの異なるインスタンスがそのvtableを共有することができます。静的メンバーはデータセクション(.data)に格納されるため、vtableも実行可能ファイルのデータセクションに格納されます。
0
実装に依存します。はい。
g ++(4.9.0)の場合、仮想テーブル(ポインタではない)はELFファイルのセクション.rodataとそれに対応するセグメントLOADをメモリに格納します。
関連する問題
- 1. メンバ関数はどこに格納されていますか?
- 2. C++(仮想)関数テーブル
- 3. インテル®C++コンパイラーは、vptr(仮想関数表へのポインター)をオブジェクトに格納する場所はどこですか?
- 4. rvaluesはC++にどこに格納されていますか?
- 5. 関数のこの値はどこに格納されていますか?
- 6. はCefRequesthandlerクラスの仮想関数C++
- 7. DWORDにリモート仮想アドレスを格納していますか?
- 8. C++仮想関数テーブルの取得インデックス
- 9. クラスのオブジェクトのデータはどこに格納されますか?
- 10. 継承クラスのC++仮想関数
- 11. メンバー関数へのポインタを格納することによる仮想動作
- 12. C++仮想関数が隠されています
- 13. クラス内の値の型はどこに格納されていますか?
- 14. JavaクラスはOracleにどこに格納されていますか?
- 15. Cプログラムに格納されている変数はどこですか?
- 16. すべてのクラスはC++で仮想関数テーブルを持っていますか
- 17. どのテーブルにスキーマが格納されていますか?
- 18. Scanner.next()のインデックスはどこに格納されていますか
- 19. vftable [0]は、最初の仮想関数またはRTTI Complete Object Locatorを格納していますか?
- 20. この関数はどのようにオブジェクトに格納されますか?
- 21. 仮想コンストラクタはどこで使用されていますか?
- 22. 識別フィールドはどこに格納されていますか?
- 23. eclipse args []はどこに格納されていますか?
- 24. L1d CPUキャッシュタグはどこに格納されていますか?
- 25. IsPostBackプロパティはどこに格納されていますか? asp.net
- 26. これらの関数は、Oracleデータベースにどこに格納されていますか?
- 27. 変数はSQLサーバーにどこに格納されますか?
- 28. 仮想関数のリンカエラーC++
- 29. 純粋仮想関数でC++クラスを使用するには?
- 30. DLLのグローバル変数はどこに格納されていますか?
実装定義です。標準では、vtable _at all_が存在する必要もなく、実行可能であると判明した場合、コンパイラは他の方法で仮想継承を実装できます。 – leftaroundabout