如何使在Dev C++下编译的程序更小

How to make programs compiled under Dev C++ smaller?

本文关键字:程序 编译 何使 Dev C++      更新时间:2023-10-16

我使用的是5.4.0版本,最简单的程序(空屏幕)几乎有1兆字节。例如,编译后,下面这个简单的程序有1276kB。但删除#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

除非必要,否则不要使用printf。它引入了大量代码,尤其是格式化浮点数字时。

链接未使用的函数

编译器是否从库文件中提取未使用的函数
一些编译器链接整个库文件,而不仅仅是其中使用的函数。

调试与发布指标

你是在测量调试(有符号)还是发布(没有符号)
你是在衡量静态库版本,还是只衡量没有动态库的代码?

内联函数

查看任何内联函数
将较大的内联函数转换为非内联函数。

模板

将通用代码从模板中移除并放入函数中。

静态&全局初始化变量

减少静态和全局初始化变量的数量
初始化会占用可执行文件中的空间。尽可能将常量变量声明为static const

字符串和文本

将通用文本文本放在一个文件中,并返回对它们的引用或常量指针
这将有助于编译器在模块之间合并重复的字符串。

常见代码片段

分析常见代码片段的函数。将它们分解为单独的函数或方法。

动态库

将一些功能移动到动态库中。让操作系统决定何时使用代码。

未来的功能

删除与当前未执行的未来功能相关的所有代码。

将数据移动到数据文件

数据在可执行文件中占据空间,尤其是用于初始化静态或全局变量的值。请考虑将数据移动到文件中,然后根据需要加载数据。


其中一些建议会收缩可执行文件,但不会收缩应用程序,例如数据文件和动态库。它们是执行程序所必需的,但在可执行文件中可能不需要。

有些建议会降低应用程序的性能。抱歉,这是时间/内存的折衷:您可以节省内存,但需要更多的执行时间(例如打包字段)。