コンパイル済みの(小さな)目的Cファイルの半分がゼロの大きなブロックであるのはなぜですか?
-
02-07-2019 - |
質問
テキストエディターでコンパイル済みのHello World Obj-Cアプリケーションを開いたところ、驚いたことに、約8キロバイトの00 00 00 00 00 00 00 00 ....
が見つかりました。これらはなぜここにあるのですか?これらのゼロをクリアする方法はありますか(多分多すぎる機能があると思いますか)
明らかに this ファイルではそれほど重要ではありません。最初はわずか16kBですが、とにかく知りたいです。
解決
ほとんどの場合、コード、データ、再配置、または使用する実行可能形式の他のセクション間のパディングです。
リンカーは、このようなセクションを4kまたは8kの境界に埋め込むことを好みます。これにより、メモリの無駄が少しかかりますが、ロード時間が短縮されます。
単純なハローワールドでは重要ですが、大規模なアプリケーションでは、パディングに使用される余分なメモリは無視できます。
他のヒント
Objective-Cはインクリメンタルリンクをサポートしていますか?これで、多くのパディングスペースが存在する理由を説明できます。
一部のコンパイラまたはリンカでは、ファイルサイズにラウンド数が必要です。コードを追加しても、ファイルサイズが増加しないことがわかります。それがあなたが見ているゼロだと思う。
たぶんそれは静的変数ですか?多くのC言語のように、静的と宣言された変数の初期値は、コンパイラーによって出力されるコードに埋め込まれています。実行時に、この初期値はプロセスのメモリにマップされます。たぶん、あなた(またはあなたがインクルードまたはリンクしているコード)は、8 KBのゼロで初期化された配列を定義します。
所属していません StackOverflow