我使用的是5.4.0版,最简单的程序(空屏)几乎有一兆字节。 例如,在编译之后,这个简单的程序有1 276 KB。但删除#include使文件非常小:27 KB。
#include<iostream>
using namespace std;
int sum(int a){
if(a>1)
return sum(a-1)+a;
else
return 1;
}
int main(){
int a=1;
while(a>=0){
cout<<"a = ";
cin>>a;
cout<<"1+...+a = "<<sum(a)<<endl;
}
return(0);
}
在我看来,应该可以为上面生成一个小得多的可执行文件。我该如何实现这一目标?
答案 0 :(得分:1)
以下是我的经验中的一些想法:
查看所有源代码并删除未使用的代码,包括未执行的未使用的函数和语句块。使用静态代码分析器来帮助找到它们。
除非必要,否则请勿使用printf
。
它涉及很多代码,特别是对于格式化浮点数。
您的编译器是否在库文件中使用未使用的函数? 有些编译器链接在整个库文件中,而不仅仅是从中使用的函数。
您是在测量调试(带符号)还是释放(无符号)? 您是在测量静态库版本还是仅测量没有动态库的代码?
查看任何内联功能 将较大的内联函数转换为非内联函数。
从模板和函数中删除公共代码。
减少静态和全局初始化变量的数量
初始化会占用可执行文件中的空间。
尽可能将常量变量声明为static const
。
将常用文本文字放入一个文件中,并返回对它们的引用或常量指针 这将有助于编译器跨模块合并重复的字符串。
分析公共代码片段的功能。将它们分解为单独的函数或方法。
将一些功能移动到动态库中。让操作系统确定何时使用代码。
删除与当前未执行的未来功能相关的所有代码。
数据占用了可执行文件的空间,尤其是用于初始化静态或全局变量的值。考虑将数据移动到文件并按需加载数据。
其中一些建议会缩小您的可执行文件,但不会缩小应用程序,例如数据文件和动态库。它们将是您的程序执行所必需的,但可执行文件中可能不需要它们。
某些建议会降低应用程序的性能。对不起,这是时间/内存权衡:您可以节省内存但是需要更多的执行时间(例如打包字段)。