我使用的是5.4.0版本,最简单的程序(空屏)几乎有1兆字节。 例如,下面这个简单程序编译后有 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);
}
在我看来,应该可以为上述生成一个更小的可执行文件。我该如何实现这一目标?
以下是我的经验中的一些想法:
审查所有源代码并删除未使用的代码,包括未使用的函数和不会执行的语句块。 使用静态代码分析器来帮助查找它们。
除非必要,否则不要使用
printf
。
它包含大量代码,特别是用于格式化浮点数的代码。
您的编译器是否从库文件中提取未使用的函数?
有些编译器链接整个库文件,而不仅仅是其中使用的函数。
您正在测量调试(带符号)还是发布(无符号)?
您是测量静态库版本还是仅测量没有动态库的代码?
查看所有内联函数。
将较大的内联函数转换为非内联函数。
将通用代码从模板中删除并放入函数中。
减少静态和全局初始化变量的数量。
初始化会占用可执行文件中的空间。
尽可能将常量声明为
static const
。
将常见文本文字放入一个文件中,并返回对它们的引用或常量指针。
这将有助于编译器跨模块合并重复的字符串。
分析常见代码片段的函数。 将它们分解为单独的函数或方法。
将一些功能移至动态库中。 让操作系统决定何时使用该代码。
删除所有与当前未执行的未来功能相关的代码。
数据占用可执行文件中的空间,尤其是用于初始化静态或全局变量的值。 考虑将数据移动到文件并按需加载数据。
其中一些建议会缩小您的可执行文件,但不会缩小应用程序,例如数据文件和动态库。 您的程序执行需要它们,但可执行文件中可能不需要它们。
一些建议会降低应用程序的性能。 抱歉,这是时间/内存的权衡:你可以节省内存,但会花费更多的执行时间(例如打包字段)。