c++ - 已编译二进制文件的大小如何取决于所使用的库? C/C++

标签 c++ c gcc iostream stdio

上周我在网上发现了一款​​名为 killallcops.exe 的简单游戏. 我研究了二进制文件,想知道为什么程序这么大。 (约460k)

所以我用iostream重写了游戏

#include <iostream>
int main(){
    std::cout << "All cops are killed.\nCongratulations";
    std::cin.ignore();
    return 0;
}

用g++编译也得到了460k。

我真的很奇怪为什么这个东西这么大,用stdio重写了

#include <stdio.h>
int main(){
    printf("All cops are killed.\nCongratulations");
    while(getchar() != '\n'){}
    return 0;
}

用gcc编译得到13k。

我知道 iostream 比 stdio 有更多的能力(比如类型安全),因此它本身更大,但是为什么这会导致更大的二进制文件,并且在使用 iostream 时是否有减少大小的解决方案,例如仅使用特定部分是吗?

编辑:如下所述,在 cygwin 下使用 gcc 3.4.4

最佳答案

我会充实我的评论作为答案:

<iostream>有很多内部依赖性,即使使用简单的 cout 调用也是如此。它引入了许多它需要工作的其他代码/ header (包括模板代码等)。首先让我们说一下引入的大小 <iostream>在重要的应用程序中可能不是很重要。

您可以相信编译器/链接器知道它们在做什么,但如果您想减小二进制大小,请尝试使用像 gcc -s 这样的选项。 ,去除符号或标志,如 -Os它试图优化二进制文件的大小。

我怀疑您的很多二进制大小问题实际上来自其他原因:静态链接 libstdc++ .

如果您在 Windows 上使用 MinGW,请注意直到最近,他们对 GCC 工具链的实现还没有动态链接 libstdc++ ;相反,所有 C++ 构建都在 libstdc++ 中静态链接这将大大增加二进制文件的大小。

这是一个比较,g++ 生成的二进制文件的大小对于您的代码,在 Linux 上,使用 GCC 4.6.1。没有对这些构建执行优化或符号剥离。

λ > ls -lh a.out          
-rwxr-xr-x 1 billylee billylee 6.1K Dec 24 10:37 a.out

这是 GCC 制作的

λ > ls -lh trial
-rwxr-xr-x 1 billylee billylee 4.9K Dec 24 10:41 trial

g++ 版本比 gcc 版本大一点,但不会大 100 倍。

编辑:如果您使用的是 MinGW - 这里有一个最近的主题:How to reduce the size of executable produced by MinGW g++ compiler?

MinGW gcc 4.5.0+ 应默认使用动态链接,如果您使用 MinGW,请检查您的版本。

关于c++ - 已编译二进制文件的大小如何取决于所使用的库? C/C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8625346/

相关文章:

c++ - 术语 "attribute"在解析器的上下文中意味着什么?

c - 读取文件 C 时出错

linux - 使用调试符号从源代码编译 glibc

gcc - 为什么 GCC 的 AVX 更慢而 LLVM 更快?

c++ - 使用 C++ 驱动程序在 mongoDB 中使用 $elemMatch 投影查找查询

c++ - 在C++中对数组使用阶乘函数

c++ - 如何使用 Coin3d/OpenInventor 添加任意数量的引擎输出

c - 进程的地址空间

用于读取测试结果的 C 程序

gcc - 如何应用 GCC 补丁