Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
编译的C++;可执行文件巨大? 在C中编程了一段时间后,我决定最终开始学习C++。这有点困扰我,因为C语言中的标准“hello world”通常是~16KB,包括编译器抛出的所有crud。(使用stdio) 但是,当我创建一个C++可执行文件做Hello World时,文件是~470KB!我继续使用cstdio而不是iostream,我认为这会带来不同,它确实做到了_C++_Windows_Filesize - Fatal编程技术网

编译的C++;可执行文件巨大? 在C中编程了一段时间后,我决定最终开始学习C++。这有点困扰我,因为C语言中的标准“hello world”通常是~16KB,包括编译器抛出的所有crud。(使用stdio) 但是,当我创建一个C++可执行文件做Hello World时,文件是~470KB!我继续使用cstdio而不是iostream,我认为这会带来不同,它确实做到了

编译的C++;可执行文件巨大? 在C中编程了一段时间后,我决定最终开始学习C++。这有点困扰我,因为C语言中的标准“hello world”通常是~16KB,包括编译器抛出的所有crud。(使用stdio) 但是,当我创建一个C++可执行文件做Hello World时,文件是~470KB!我继续使用cstdio而不是iostream,我认为这会带来不同,它确实做到了,c++,windows,filesize,C++,Windows,Filesize,我的问题是: 当我包含iostream时,为什么我的可执行文件的大小会爆炸 编辑:我正在使用G++(与Dev CPP IDE一起使用,但我可以找到如何添加CL参数)因为您已经使用iostreams拖入了大多数标准库。 这是一件一次性的事情,所以随着你的程序越来越大,它的开销似乎越来越小 但是,您可能希望使用标准库的共享库版本进行编译,大多数编译器/操作系统都允许您这样做,因此您不必在可执行文件中包含所有标准库。您使用的是哪种编译器,我们可能会建议您如何使用 在使用VC命令行的windows上,例

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


编辑:我正在使用G++(与Dev CPP IDE一起使用,但我可以找到如何添加CL参数)

因为您已经使用iostreams拖入了大多数标准库。 这是一件一次性的事情,所以随着你的程序越来越大,它的开销似乎越来越小

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


在使用VC命令行的windows上,例如使用/MD命令行选项

我猜通过包含
你间接地包含了STL的许多部分,比如
,而
又包含
等等。

总之,符号

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*
$cat hello.c
#包括
int main(){
printf(“%s\n”,“你好,世界!”);
返回0;
}
$cat hello.cpp
#包括
int main(){

std::cout这几乎是您使用的编译器(和选项)的产物。使用MS VC++时,根据我使用的编译器标志,我可以得到~8K到~110K之间的任何地方。使用MinGW,我得到大约24-25K(同样,取决于标志)

如果你想知道的话,我猜我在VC++中获得的较大范围主要是因为我更好地了解了它的标志。即使我更了解它,MinGW可能只覆盖较小的范围,但由于我对它的标志了解有限,我默认接受它的大部分功能;我知道如何打开和关闭优化,但必须看看这个ngs非常小心地做了很多事情。

MinGW(g++)编译了非常大的文件。
例如,使用iostreams的同一个“hello world”程序通过VC++(使用静态链接的CRT)编译到约100KB,通过g++编译到约470KB。

这是一个事实:)

你知道,当我们有了第一个C++编译器时,在AT&T中,我编译了“hello World”,并且不能相信可执行文件的大小。 什么?从那以后,编译器已经走过了很长的路

他们有吗?在最新版本的g++上试用-半兆字节不会有太多变化


用C术语来说,这是使用putc和printf之间的区别。printf代码有很多功能,可以(相对地)装载C可执行文件和简单的putc函数。在Saustin的情况下,方法相对于printf是“巨大的”,STL是“巨大的”相对于。我想指出,DEV-C++附带了一个非常古老的GCC版本。考虑移动到WXDEV-C++或代码::块,这两个都是更为接近的。嗨,谢谢你花时间来做结果。我在Windows中使用了'-s- O3’标志,文件大小从475 kb减少到263kb。它有帮助,但是我是否还有更多的I?可以吗?@Saustin:使用一个更新的编译器。你使用的是一个非常旧的编译器。它可能带有一些无法在新版本上全局化的缺陷。Dev-C++没有维护,所以当有这么多更好的选择时,没有理由继续使用它。我的意思是,最新的版本是在2005年发布的!这是真的;有com吗您可能会推荐的Piler?(PS:抱歉,验证时间太长!)@Saustin:MinGW打包的版本是最新的。打包的版本(与您使用的版本不同)是最新的。您也可以使用它,它也是最新的。这并不是很有帮助,但有些幽默有帮助。对于最新的Visual Studio和MinGW w-64以及GCC 7.2.0(使用CMake用于发布版本的标准编译器标志),情况仍然如此。