-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

必要な場合以外は使用しprintfないでください。特に浮動小数点数をフォーマットするために、多くのコードを運びます。

未使用関数でのリンク

コンパイラは、ライブラリ ファイルから未使用の関数を取り込みますか?
一部のコンパイラは、ライブラリ ファイルから使用される関数だけでなく、ライブラリ ファイル全体をリンクします。

デバッグとリリースの指標

デバッグ (シンボルあり) またはリリース (シンボルなし) を測定していますか?
静的ライブラリのバージョンを測定していますか、それとも動的ライブラリのないコードのみを測定していますか?

インライン関数

インライン関数を確認します。
大きなインライン関数を非インラインに変換します。

テンプレート

共通コードをテンプレートから関数に削除します。

静的およびグローバル初期化変数

静的およびグローバルに初期化される変数の数を減らします。
初期化は、実行可能ファイルのスペースを占有します。static const可能な限り定数変数を宣言します。

文字列とテキスト

共通のテキスト リテラルを 1 つのファイルに配置し、それらへの参照または定数ポインターを返します。
これは、モジュール間で重複する文字列をマージする際にコンパイラを支援します。

一般的なコードの断片

一般的なコード フラグメントの関数を分析します。それらを個別の関数またはメソッドに分解します。

動的ライブラリ

一部の機能を動的ライブラリに移動します。コードをいつ使用するかを OS に決定させます。

将来の機能

現在実行されていない将来の機能に関連するすべてのコードを削除します。

データをデータファイルに移動

データ、特に静的変数またはグローバル変数の初期化に使用される値は、実行可能ファイル内のスペースを占有します。データをファイルに移動し、オンデマンドでデータをロードすることを検討してください。


これらの提案のいくつかは、実行可能ファイルを圧縮しますが、データ ファイルや動的ライブラリなどのアプリケーションは圧縮しません。これらはプログラムの実行に必要ですが、実行可能ファイルでは必要ない場合があります。

いくつかの提案は、アプリケーションのパフォーマンスを低下させます。申し訳ありませんが、これは時間とメモリのトレードオフです。メモリを節約できますが、実行時間は長くなります (フィールドのパッキングなど)。

于 2013-02-20T22:13:17.237 に答える