[解決済み] Goのコンパイル済み実行ファイルのサイズが巨大化する理由
質問
Hello worldというGoプログラムをコンパイルして、Linuxマシン上でネイティブの実行ファイルを生成しました。しかし、単純なHello world Goプログラムのサイズを見て驚きました、それは1.9MBでした!
なぜ、このような単純なプログラムの実行形式がこんなに巨大なのでしょうか?
どうすれば解決するのでしょうか?
この質問は、公式のFAQに掲載されているものと同じです。 なぜ私のつまらないプログラムはこんなに大きなバイナリなのですか?
答えを引用します。
<ブロッククオート
gcツールチェーンに含まれるリンカー(
5l
,
6l
そして
8l
) は静的リンクを行います。したがって、すべての Go バイナリには Go ランタイムと、動的な型チェック、リフレクション、さらにはパニック時のスタック トレースをサポートするために必要なランタイム型情報が含まれています。
Linux 上で gcc を使用して静的にコンパイルおよびリンクされた単純な C の "hello, world" プログラムは約 750kB で、これには、次の実装が含まれます。
printf
. を使用した同等の Go プログラムは
fmt.Printf
を使った同等の Go プログラムは約 1.9 MB ですが、これにはより強力なランタイムサポートと型情報が含まれています。
Hello World のネイティブ実行ファイルが 1.9 MB なのは、ガベージコレクション、リフレクション、その他多くの機能 (プログラムは実際には使用しないかもしれませんが、存在します) を提供するランタイムが含まれているからです。そして
fmt
パッケージの実装も含まれています。
"Hello World"
テキスト(とその依存関係)を印刷するために使用したパッケージです。
では、次のようにしてみてください。
fmt.Println("Hello World! Again")
の行を追加して、もう一度コンパイルしてください。結果は 2x 1.9MB ではなく、まだ 1.9MB です! そうです、使用されているすべてのライブラリ (
fmt
とその依存関係)とランタイムはすでに実行ファイルに追加されているからです(したがって、先ほど追加した2番目のテキストを印刷するために、さらに数バイトが追加されるだけです)。
関連
-
[解決済み] 実行ファイルのパスを取得する
-
[解決済み] time.Sleepを使わずにすべてのゴルーチンが終了するのを待つには?
-
[解決済み] Goを使って大きなファイルを効率よくダウンロードするにはどうしたらいいですか?
-
[解決済み] スライスを宣言するのか、スライスを作るのか?
-
[解決済み] interface{}をint型に変換する
-
[解決済み] golangでは、マップから値のスライスを取得する良い方法はありますか?
-
[解決済み] ゴルーチンのスタックトレースをダンプするには?
-
[解決済み] スライスを変数入力として渡すには?
-
[解決済み] Goのargv[0]に相当するものは何ですか?
-
[解決済み] テキストファイルを文字列配列に読み込む(そして書き込む)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] response.Bodyを閉じないとどうなりますか?
-
[解決済み] ゴルーチンの停止方法
-
[解決済み] GolangでMkdirを使ってネストされたディレクトリを作成するには?
-
[解決済み] 単一値コンテキストにおける複数値
-
[解決済み] GoのToString()関数
-
[解決済み] Goでスライスを逆に反復処理する方法はありますか?
-
[解決済み] Goで関数の名前を取得するには?
-
[解決済み] go モジュール内のローカルパッケージへのアクセス (go 1.11)
-
[解決済み] 構造体の値をマップの値として設定すると、"cannot assign" エラーが発生するのはなぜですか?重複
-
[解決済み] golangにおけるバックティック(``)とダブルクォート("")の違いは何ですか?