如何使在Dev C++下编译的程序更小
How to make programs compiled under Dev C++ smaller?
我使用的是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
。
字符串和文本
将通用文本文本放在一个文件中,并返回对它们的引用或常量指针
这将有助于编译器在模块之间合并重复的字符串。
常见代码片段
分析常见代码片段的函数。将它们分解为单独的函数或方法。
动态库
将一些功能移动到动态库中。让操作系统决定何时使用代码。
未来的功能
删除与当前未执行的未来功能相关的所有代码。
将数据移动到数据文件
数据在可执行文件中占据空间,尤其是用于初始化静态或全局变量的值。请考虑将数据移动到文件中,然后根据需要加载数据。
其中一些建议会收缩可执行文件,但不会收缩应用程序,例如数据文件和动态库。它们是执行程序所必需的,但在可执行文件中可能不需要。
有些建议会降低应用程序的性能。抱歉,这是时间/内存的折衷:您可以节省内存,但需要更多的执行时间(例如打包字段)。
- 这是使用回溯的 nqueen 问题,但我使用了动态 2d 数组,我的程序编译良好,但不返回任何输出
- C ++程序编译错误,找不到/访问文件
- C++程序编译没有问题,但无法运行
- Mongdb C++ 驱动程序编译错误 for document{}.
- 添加类型名会导致程序编译失败
- 将 C 程序更改为 C++ 程序 - 编译错误
- 程序编译,但当分解为函数时实际上不会移动电机
- 如何链接 glib-2.0 库进行 c/c++ 程序编译
- 为什么 gcc 和 clang 为我的程序编译为不同的"const"结果?
- 复数程序编译时的计算方法错误
- qt 命令行应用程序编译
- 程序编译和运行,但一段时间后,它停止使用Typedef关键字在CPP上工作
- QML应用程序编译一个 *form.ui.qml文件,但忽略了关联的.qml文件
- 为什么该程序编译但不显示任何输出
- 分割故障程序编译为共享库,但不静态
- 程序编译,但我认为开关被忽略
- 程序编译后崩溃
- 什么是程序编译中的PIC级别
- 尽管使用不存在的成员,但程序编译
- C++程序编译在 Ubuntu 中失败,但在 MacOSX 中工作