上周我在网上发现了一个名为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
答案 0 :(得分:3)
我会充实我的评论作为答案:
<iostream>
有很多内部依赖关系,即使使用简单的cout调用也是如此。它带来了许多需要工作的其他代码/头文件(包括模板代码等)。我们可以说,在一个非常重要的应用程序中,引入<iostream>
的大小可能不是很重要。
您可以信任编译器/链接器以了解它们正在做什么,但是如果您想减少二进制文件大小,请尝试使用gcc -s
之类的选项来删除符号或-Os
之类的标记它试图优化二进制的大小。
我怀疑你的二进制大小问题实际上来自其他东西:静态链接的libstdc++
。
如果您在Windows上使用MinGW,请注意,直到最近,他们对GCC工具链的实施没有动态链接libstdc++
;相反,所有C ++在libstdc++
中建立静态链接,这将大大增加二进制文件的大小。
这是一个比较,使用GCC 4.6.1在Linux上为您的代码生成的g++
二进制文件的大小。没有对这些构建执行优化或符号剥离。
λ > 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,请检查您的版本。
答案 1 :(得分:2)
我不在Linux上重现(大小为9K和8K)。我的猜测是,对于C ++,你是静态链接标准库,而对于C,你是动态链接它。
答案 2 :(得分:2)
答案是:它不是那么大。在Linux上的c ++ 4.6上编译,没有编译选项,它是9040字节。剥离后它是6312字节。
您使用了哪些编译选项以及您使用的是哪个版本的g ++?
大小可能是由您的平台引起的,可能是您正在使用MinGW并且它是静态链接运行时。
另一方面,#import
是该语言不推荐使用g ++的扩展程序,您应该使用#include