私はオブジェクト(クラス)のサイズをコンパイラが知る必要があるのかと疑問に思った。つまり、オブジェクトが本当に必要なときにランタイムに延期することはできないのですか?なぜコンパイラ(javac)はオブジェクトのサイズを知る必要がありますか?
1
A
答えて
3
あるJavac
おかげでは、オブジェクトのサイズを知りません。 JVMはこれらの詳細を抽象化します。
コンパイラは、CまたはC++のようなネイティブコンパイル言語では、オブジェクトを大きな構造体内に組み込むとき、またはスタックに割り当てるときに、オブジェクトのサイズを知る必要があります*ヒープ割り当ての場合、動的なサイズのオブジェクトを持っていますが、これは非常に危険であり、正しく取得するのは難しいです。 Cでは、これは伝統的に空の配列で構造体を終了し、余分なスペースを割り当てることによって行われます。
実際には、既知のサイズと未知のサイズのタイプを区別します。後者は、限られた環境でのみ使用できます。 C/C++には、基本的に不透明なポインタとしてしか使えない、不完全な型の同様の概念があります。
*技術的には、Cはスタック上に可変サイズの配列を許可します。
関連する問題
- 1. なぜqsort()は配列の長さと配列要素のサイズを知る必要がありますか?
- 2. なぜコンパイラには.javaサフィックスが必要ですが、インタプリタには.classサフィックスは必要ありません。
- 3. なぜWizardStepオブジェクトは...として表現する必要がありますか?
- 4. なぜmochaはdevDependenciesになる必要がありますか?
- 5. なぜオブジェクト配列を2回インスタンス化する必要がありますか?
- 6. なぜこれらのオブジェクトをリリースする必要はありませんか?
- 7. なぜオブジェクトの一部を解放する必要はありませんか?
- 8. なぜC#でロックしてオブジェクト化する必要がありますか?
- 9. なぜvalue.lengthを使用する必要がありますか?
- 10. なぜPOSTデータをネストする必要がありますか?
- 11. なぜredux-thunksをディスパッチする必要がありますか?
- 12. なぜメッセージハブをポーリングする必要がありますか?
- 13. なぜ変数をリセットする必要がありますか?
- 14. なぜデータベースラッパーを作成する必要がありますか?
- 15. Reflect.construct()なぜオブジェクトプロトタイプをオーバーライドする必要がありますか?
- 16. なぜレンダリングをカウントする必要がありますか?
- 17. なぜstopPropagation()を使用する必要がありますか?
- 18. コンパイラをVSに変更する必要があります
- 19. なぜopengl32.libにリンクする必要がありますか
- 20. qtsql-querymodel-editablesqlmodel:なぜリフレッシュする必要がありますか?
- 21. AjaxUpload:なぜ2回クリックする必要がありますか?
- 22. なぜhtml_safeに注意する必要がありますか?
- 23. なぜ使用する必要がありますか?
- 24. NSNotificationオブジェクト内のすべてのリスナーを知る必要があります
- 25. なぜテンプレートクラスをエクスポートする必要はありませんか?
- 26. なぜXAMLをコンパイルする必要はありませんか?
- 27. 私はUITouchオブジェクトをリリースする必要がありますか?
- 28. なぜresolve()を呼び出す必要がありますか?
- 29. なぜ行番号を渡す必要がありますか?
- 30. セレンページオブジェクト:なぜこれを返す必要がありますか?
ありがとうございました。つまり、JVMは実際に(実行時に)必要なときにオブジェクトのサイズを決定し、そのオブジェクトがヒープ領域または非ヒープ領域にあるかどうかは関係ありません。また、C++コンパイラでは、実行時に(スタック割り当ての場合は、少なくとも理論的には)それを判断する機会がありますか? – zgulser
@zgulser JVMは何でもしたいことができます。実際には、オブジェクトのサイズはそのクラス定義(実行時に一度ロードされる)によって固定され、最適化できない限り、すべてのオブジェクトはヒープ割り当てされます。配列には特別な処理があります。 – Antimony
どのように配列を処理するのですか? – zgulser