好奇心から、C、C ++、Javaで「HelloWorlds」をコンパイルしました。
Javaクラスファイルは、ランタイムがバイナリに含まれていないため、私が理解している423Bで非常に無駄がありません。
ただし、CおよびC++のものは8.5Kおよび9.2Kです。
なぜそんなに大きいのですか?stdioまたはiostreamは動的にリンクされており、実行可能ファイルのサイズに追加されないと常に想定していました。
では、すべてのキロバイトはどこから来るのでしょうか?hexdumpを見ると、多くのパディングがあることがわかります。パフォーマンス上の理由から推測できます。なぜバイナリ形式がそのように編成されているのですか?
pmgのリンクはとても役に立ちます!
パディングに関しては、プログラムのセグメントを仮想メモリのページ境界(4096バイト)に揃えることで、少なくとも8192バイトになることがわかりました。
mach-oバイナリ形式について(OS XおよびiOS用)
最高のパフォーマンスを得るには、セグメントを仮想メモリのページ境界(PowerPCおよびx86プロセッサの場合は4096バイト)に揃える必要があります。セグメントのサイズを計算するには、各セクションのサイズを合計してから、その合計を次の仮想メモリページの境界(4096バイトまたは4キロバイト)に切り上げます。このアルゴリズムを使用すると、セグメントの最小サイズは4キロバイトになり、その後は4キロバイト単位でサイズが決定されます。
次回質問する前に調査します;)