在C编程一段时间后,我决定最终开始学习C ++。这有点让我困扰,因为C中的标准“hello world”通常是大约16KB,包括你的编译器在那里抛出的所有crud。 (使用stdio)
但是,当我创建一个执行hello world的C ++可执行文件时,该文件大约为470KB!我继续使用cstdio代替iostream,认为它会产生影响而且确实如此。
我的问题是: 当我包含iostream时,为什么我的可执行文件的大小会爆炸?
编辑:我正在使用G ++(使用Dev-CPP IDE,但我可以弄清楚如何添加CL参数)
答案 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 ++ - 半小时内不会有太多变化。