-2

我使用的是 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);
}

在我看来,应该可以为上述生成一个小得多的可执行文件。我该如何实现这一目标?

4

1 回答 1

1

以下是我经验中的一些想法:

死代码

查看所有源代码并删除未使用的代码,包括未使用的函数和不会执行的语句块。使用静态代码分析器来帮助找到它们。

打印

printf除非必要,否则不要使用。它包含大量代码,尤其是格式化浮点数。

链接未使用的函数

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

调试与发布指标

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

内联函数

查看所有内联函数。
将较大的内联函数转换为非内联函数。

模板

从模板和函数中删除通用代码。

静态和全局初始化变量

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

字符串和文本

将常见的文本文字放入一个文件并返回指向它们的引用或常量指针。
这将帮助编译器跨模块合并重复的字符串。

常见代码片段

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

动态库

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

未来的功能

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

将数据移动到数据文件

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


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

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

于 2013-02-20T22:13:17.237 回答