编译的C ++可执行文件巨大?

时间:2010-11-14 18:21:46

标签: c++ windows filesize

在C编程一段时间后,我决定最终开始学习C ++。这有点让我困扰,因为C中的标准“hello world”通常是大约16KB,包括你的编译器在那里抛出的所有crud。 (使用stdio)

但是,当我创建一个执行hello world的C ++可执行文件时,该文件大约为470KB!我继续使用cstdio代替iostream,认为它会产生影响而且确实如此。

我的问题是: 当我包含iostream时,为什么我的可执行文件的大小会爆炸?

编辑:我正在使用G ++(使用Dev-CPP IDE,但我可以弄清楚如何添加CL参数)

6 个答案:

答案 0 :(得分:7)

因为你使用iostreams拖入大部分标准库。 这是一件容易的事情,但随着你的程序越来越大,它似乎越来越少的开销。

但是,您可能希望使用标准库的共享库版本进行编译,并且大多数编译器/操作系统都允许您执行此操作,因此您不必在可执行文件中包含所有标准库。您正在使用哪种编译器,我们可能会建议如何执行此操作。

在具有VC命令行的Windows上,例如使用/ MD命令行选项。

答案 1 :(得分:6)

总之,符号

C ++标准库为您的程序引入了 lot 符号,因为大多数库主要存在于头文件中。

在发布模式下重新编译程序,没有调试符号,您可以轻松地期望程序显着缩小。 (如果你删除符号,则会更小。)

作为对此事实的快速演示,请观察:

$ cat hello.c
#include <stdio.h>
int main() {
    printf("%s\n", "Hello, world!");
    return 0;
}
$ cat hello.cpp
#include <iostream>
int main() {
    std::cout << "Hello, world!\n";
    return 0;
}
$ gcc hello.c -o hello-c
$ g++ hello.cpp -o hello-cpp
$ gcc hello.c -ggdb -o hello-c-debug
$ g++ hello.cpp -ggdb -o hello-cpp-debug
$ gcc hello.c -s -o hello-c-stripped
$ g++ hello.cpp -s -o hello-cpp-stripped
$ gcc hello.c -s -O3 -o hello-c-stripped-opt
$ g++ hello.cpp -s -O3 -o hello-cpp-stripped-opt
$ ls -gG hello*
-rwxr-xr-x 1  6483 Nov 14 15:39 hello-c*
-rw-r--r-- 1    79 Nov 14 15:38 hello.c
-rwxr-xr-x 1  7859 Nov 14 15:40 hello-c-debug*
-rwxr-xr-x 1  7690 Nov 14 15:39 hello-cpp*
-rw-r--r-- 1    79 Nov 14 15:38 hello.cpp
-rwxr-xr-x 1 19730 Nov 14 15:40 hello-cpp-debug*
-rwxr-xr-x 1  5000 Nov 14 15:45 hello-cpp-stripped*
-rwxr-xr-x 1  4960 Nov 14 15:41 hello-cpp-stripped-opt*
-rwxr-xr-x 1  4216 Nov 14 15:45 hello-c-stripped*
-rwxr-xr-x 1  4224 Nov 14 15:41 hello-c-stripped-opt*

我无法解释为什么使用G ++编写的Windows程序会产生如此大的可执行文件,但在任何其他平台上,符号是大文件大小的主要驱动因素。我目前无法访问Windows系统,因此无法测试。

答案 2 :(得分:2)

我猜想,通过加入<iostream>,您间接包含了STL的许多部分,例如<string>,而<vector>又包含{{1}}等。

答案 3 :(得分:2)

这是您使用的编译器(和选项)的工件,而不是其他任何东西。使用MS VC ++,根据我使用的编译器标志,我可以从~8K到~110K。使用MinGW,我得到大约24-25K(再次,取决于标志)。

万一你想知道,我猜我用VC ++获得的更大范围 主要是更好地了解它的标志。 MinGW 可能只能覆盖更小的范围,即使我知道它更好,但由于我对其旗帜知之甚少,我接受它默认的大部分内容;我知道如何打开和关闭优化,但必须仔细查看事情,以做更多的事情。

答案 4 :(得分:1)

MinGW(g ++)编译非常大的文件 例如,带有iostream的相同“hello world”程序通过VC ++(使用静态链接的CRT)编译为~100KB,并通过g ++编译为~470KB。

答案 5 :(得分:1)

这是fake C++ interview的一个方面,实际上是真的:)

  

你知道,当我们有第一个C ++编译器时,在AT&amp; T,我编译了“Hello World”,并且无法相信可执行文件的大小。 2.1MB

     

什么?那么,从那时起,编译器已经走了很长的路。

     他们有?尝试使用最新版本的g ++ - 半小时内不会有太多变化。