2011-12-24 13 views
2

先週私はkillallcops.exeと呼ばれる簡単なゲームをWeb上で見つけました。 私はバイナリを研究し、なぜプログラマがそれほど大きいのだろうと思った。 (約460K)コンパイルされたバイナリのサイズは、使用するライブラリにどのように依存しますか? c/C++

だから私はグラムとそれをコンパイルしたのiostream

#include <iostream> 
int main(){ 
    std::cout << "All cops are killed.\nCongratulations"; 
    std::cin.ignore(); 
    return 0; 
} 

を使用してゲームを書き直し++、あまりにも460Kを得ました。

この事はとても大きかったとstdioの

#include <stdio.h> 
int main(){ 
    printf("All cops are killed.\nCongratulations"); 
    while(getchar() != '\n'){} 
    return 0; 
} 

gccで、それをコンパイルし、13Kを得たを使用してそれを書き直し、なぜ私は本当に疑問に思いました。

iostreamはstdio(typesafetyなど)よりもはるかに優れていることがわかっています。そのため、サイズが大きくなり、iostreamを使用するとサイズが小さくなるソリューションがあります。それの部分?

編集:私はLinux上で再現していないcygwinの

+0

1つの推測:テンプレート。 –

+0

コンパイルするアセンブリを表示できますか? –

+2

''は、単純な 'cout'呼び出しを使っていても、多くの内部依存関係を持っています。それには、(テンプレートコードなどを含む)多くの他のコード/ヘッダが必要です。コンパイラ/リンカは彼らが何をしているのかを知ることができますが、バイナリサイズを減らしたい場合は、シンボルを削除する 'gcc -s'や最適化を試みる' -Os'のようなオプションを試してみてくださいサイズのバイナリ。しかし、重要なアプリケーションでは、 ''の持ち込みサイズはあまり重要ではありません。 – birryree

答えて

3

を使用する必要があります。

<iostream>は、内部をたくさん持っていますたとえ単純なcout呼び出しを使用していたとしても。それには、(テンプレートコードなどを含む)多くの他のコード/ヘッダが必要です。正面を見てみましょう。<iostream>のサイズは、重要なアプリケーションではそれほど重要ではないでしょう。

バイナリサイズを減らす場合は、gcc -sのようなオプションを使用してシンボルを削除するか、またはバイナリの最適化を試みる-Osなどのフラグを使用してみてください。サイズ。

バイナリサイズの問題の多くは実際には他の何かから来ていると思われます:静的にリンクされたlibstdc++

WindowsでMinGWを使用している場合、ごく最近まで、GCCツールチェーンの実装には動的にリンクされたlibstdc++が含まれていなかったことに注意してください。代わりにすべてのC++ビルドは、バイナリのサイズを大幅に増やすlibstdc++に静的にリンクしています。

GCC 4.6.1を使用して、Linux上でコードにg++が生成するバイナリのサイズを比較します。これらのビルドでは、最適化やシンボルストリッピングは実行されませんでした。

λ > ls -lh a.out   
-rwxr-xr-x 1 billylee billylee 6.1K Dec 24 10:37 a.out 

そしてここでは、GCC

λ > ls -lh trial 
-rwxr-xr-x 1 billylee billylee 4.9K Dec 24 10:41 trial 

グラム++バージョンがgccのバージョンよりも少し大きいにより製造されたものではなく、100倍も大きいのです。

編集: - :How to reduce the size of executable produced by MinGW g++ compiler?

のMinGWのgcc 4.5.0+あなたはMinGWのを使用している場合は、あなたのバージョンを確認し、デフォルトでダイナミックリンクを使用する必要がありますあなたはMinGWのを使用している場合は、ここ最近のスレッドがあります。

+0

はい、私はcygwin gccを使用していることに言及するのを忘れました。ちょうどチェック、バージョン3.4.4私は更新し、後でチェックします。説明ありがとう。 – Baarn

+0

cygwin gccを更新することはより大きな問題でしたが、私は大学のLinuxボックス(私自身数日前に電撃しました)で試してみました。ありがとう – Baarn

2

下のgcc 3.4.4を使用して以下のとおり(サイズは9Kと8Kです)。私の推測では、C++では静的に標準ライブラリをリンクしていますが、Cでは動的にリンクしています。

2

答えは:それほど大きくはありません。コンパイルオプションなしでLinux上のC++ 4.6でコンパイルされたのは9040バイトです。ストリッピングした後は6312バイトです。

どのコンパイルオプションを使用しましたか、どのバージョンのg ++​​を使用していますか?

MinGWを使用しており、ランタイムを静的にリンクしている場合など、プラットフォームによってサイズが異なる可能性があります。私は答えとして私のコメントを肉付けますサイドノートで

#importは非推奨gである++言語への拡張子だけ、あなたは#include

+0

これは本当にインクルードしていましたが、過去数日間は多すぎるJavaを使用していたので、私のメモリからコードを書くときにエラーが出ました。 – Baarn

+0

@leftもしあなたがデフォルトでlinuxでコンパイルすると、rtlはウィンドウ上と同じように静的にリンクされません。もちろん、それは小さくなるでしょう、それは同等の比較ではありません。 – greatwolf

関連する問題