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

Sau*_*tin 5 c++ windows filesize

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

但是,当我创建一个执行hello world的C++可执行文件时,该文件大约为470KB!我继续使用cstdio而不是iostream,认为它会有所作为而且确实如此.

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

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

jco*_*der 7

因为你已经使用iostream拖入了大部分标准库.这是一个一件事,但随着你的程序越来越大,它似乎越来越少的开销.

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

在具有VC命令行的窗口上,例如使用/ MD命令行选项.


gre*_*ade 6

总之,符号.

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*
Run Code Online (Sandbox Code Playgroud)

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