在C编程了一段时间之后,我决定终于开始学习C ++了。 这有点困扰我,因为C语言中的标准“hello world”通常约为16KB,包括编译器在这里抛出的所有内容。 (使用stdio)
但是,当我创build一个Hello World的C ++可执行文件时,该文件是〜470KB! 我继续使用cstdio而不是iostream,认为它会有所作为,它做到了。
我的问题是:当我包括iostream,为什么我的可执行文件的大小爆炸?
编辑:我使用的是G ++(使用Dev-CPP IDE,但我可以弄清楚如何添加CL参数)
总之, 符号 。
C ++标准库为您的程序引入了很多符号,因为大部分库主要存在于头文件中。
重新编译你的程序在发行模式,没有调试符号,你可以很容易地期望程序明显更小。 (如果你去掉符号的话,更小一些。)
为了快速证明这一事实,请观察:
$ 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系统,所以我无法测试。
因为使用iostreams拖动了大部分标准库。 尽管如此,你的程序变得越来越大,这似乎越来越少了。
不过,您可能希望使用标准库的共享库版本进行编译,并且大多数编译器/操作系统都会让您这样做,因此您不必在可执行文件中包含所有标准库。 你正在使用哪种编译器,我们可能会建议如何做到这一点。
在使用VC命令行的Windows上,使用/ MD命令行选项。
我猜可以通过包含<iostream>
来间接地包含STL的很多部分,比如<string>
,它又包含<vector>
等
这更像是你使用的编译器(和选项)的工具,而不是其他任何东西。 随着MS VC ++,根据我使用的编译器标志,我可以得到任何地方从〜8K到〜110K。 使用MinGW,我得到24-25K(再次,取决于标志)。
以防万一你想知道,我猜想用VC ++得到的更大的范围主要是更好地知道它的标志的结果。 MinGW 可能只能覆盖更小的范围,即使我知道它更好,但由于我对旗帜的了解有限,所以我默认接受它的大部分功能。 我知道如何打开和关闭优化,但必须非常仔细地看待事情以做更多的事情。
这是假的C + +面试的一个方面,其实是真正的:)
你知道,当我们有了第一个C ++编译器的时候,在AT&T,我编译了“Hello World”,并且不能相信可执行文件的大小。 2.1MB
什么? 那么从那以后,编译器就有了很长的路要走。
他们有? 尝试使用最新版本的g ++ – 在半个兆字节之内不会有太多变化。
MinGW(g ++)编译真正的大文件。
例如,与iostreams相同的“hello world”程序通过VC ++(具有静态链接的CRT)编译为〜100KB,并且由g ++编译为〜470KB。