web-dev-qa-db-ja.com

C ++実行可能ファイルと比較して、C実行可能ファイルが小さくなる理由

CコンパイラとC++コンパイラを使用すると、出力ファイルのサイズが大幅に異なる理由を理解しようとしています。

CとC++で小さなhello worldプログラムを書いていたところ、Cバージョンでは実行可能ファイルのサイズが93.7KB、C++では同じhello worldプログラムのサイズが1.33MBであることに気付きました。なぜかはわかりません。 C++にはより多くのライブラリと名前空間を使用するため、using namespace std行と単純に使用std::cout、それでも結果は同じでした。

[〜#〜] c [〜#〜]

#include <stdio.h>

int main()
{
    printf("hello world");
    return 0;
}

//サイズ93.7KB

C++

#include <iostream>

int main()
{
    std::cout<<"Hello world";
    return 0;
}

//サイズ1.33MB

上記のコードに大きな違いはないようです。異なるファイルサイズを作成するコンパイラの違いのようなものはありますか?

8
Hawk

coutが含まれるすべてのストリームを含むほとんどのC++標準ライブラリは、インラインテンプレートクラスです。これらのインラインライブラリコンポーネントのいずれかを#includeすると、コンパイラはすべてのコードをコピーして、それを含むソースファイルに貼り付けます。これにより、コードの実行速度が向上しますが、最終的な実行可能ファイルに多くのバイトが追加されます。これがおそらく結果の理由です。

OSX(Apple LLVMバージョン5.1)でclangコンパイラを使用して同様のテストを行い、デフォルトのフラグを使用すると、同等の結果が得られました。

hello_cpp_cout:

#include <iostream>
int main()
{
    std::cout << "Hello world" << std::endl;
    return 0;
}

サイズ:14,924バイト

hello_c:

#include <stdio.h>
int main()
{
    printf("hello world\n");
    return 0;
}

サイズ:8,456バイト

さらに、おまけとして、.cppファイルをhello_cとまったく同じコードでコンパイルしようとしました。つまり、printfの代わりにcoutを使用しました。

hello_cpp_printf:

#include <stdio.h>
int main()
{
    printf("hello world\n");
    return 0;
}

サイズ:8,464バイト

ご覧のとおり、実行可能ファイルのサイズは言語にはほとんど関係ありませんが、プロジェクトに含めるライブラリには関係しています。

更新:

いくつかのコメントやその他の返信で指摘されているように、コンパイラフラグの選択も、コンパイルされた実行可能ファイルのサイズに影響します。たとえば、デバッグフラグでコンパイルされたプログラムは、リリースフラグでコンパイルされたプログラムよりもはるかに大きくなります。

22
glampert

上記のコードに大きな違いはないようです。

はいあります。それは完全に異なるコードです。 c ++ iostreamライブラリは、より多くのインラインコードを作成するテンプレートに大きく依存しているため、C++実行可能ファイルは大きくなります。

もう1つの理由は、実行可能ファイルからデバッグシンポールを削除しなかったためです。C++の場合、シンボルは非常に冗長です。 Linuxを使用している場合は、「strip」コマンドを使用してこれらのシンボルを削除すると、実行可能ファイルのサイズが小さくなります。

7
Nikko

実行可能サイズの違いは、指定されたリンケージのタイプ、最適化、および使用されているコンパイラーに大きく依存します。

最終的なサイズに大きな違いがあることを考えると、C++バリアントはランタイムと静的にリンクされているように見えます。これを削除または変更すると、C++サイズが低下するはずです。 gcc(g ++)の場合、--static*などを探します。 alおよびmsvcの場合/MDおよび/MT

5
Niall

実際にはかなりの違いがあります。 Cコードは、フォーマットされていないローカライズされた出力を使用します。 C++の同等物には、ロケールの変更やその種のことについて、かなりの問題があります。機能的には、それらは同等ではありません。あなたはたまたまC++インターフェースのごく一部だけを使用しています。

ただし、より一般的には、コードサイズが大きいということは、特に標準ライブラリのこの特定の部分の欠陥であり、一般にC++言語ではなく、過度に設計され、遅く、大きいことがよく知られています。

2
DeadMG