ここに私の経験からのいくつかのアイデアがあります:
デッドコード
すべてのソース コードを確認し、使用されていない関数と実行されないステートメント ブロックの両方で、使用されていないコードを削除します。それらを見つけやすくするために、静的コード アナライザーを使用します。
Printf
必要な場合以外は使用しprintf
ないでください。特に浮動小数点数をフォーマットするために、多くのコードを運びます。
未使用関数でのリンク
コンパイラは、ライブラリ ファイルから未使用の関数を取り込みますか?
一部のコンパイラは、ライブラリ ファイルから使用される関数だけでなく、ライブラリ ファイル全体をリンクします。
デバッグとリリースの指標
デバッグ (シンボルあり) またはリリース (シンボルなし) を測定していますか?
静的ライブラリのバージョンを測定していますか、それとも動的ライブラリのないコードのみを測定していますか?
インライン関数
インライン関数を確認します。
大きなインライン関数を非インラインに変換します。
テンプレート
共通コードをテンプレートから関数に削除します。
静的およびグローバル初期化変数
静的およびグローバルに初期化される変数の数を減らします。
初期化は、実行可能ファイルのスペースを占有します。static const
可能な限り定数変数を宣言します。
文字列とテキスト
共通のテキスト リテラルを 1 つのファイルに配置し、それらへの参照または定数ポインターを返します。
これは、モジュール間で重複する文字列をマージする際にコンパイラを支援します。
一般的なコードの断片
一般的なコード フラグメントの関数を分析します。それらを個別の関数またはメソッドに分解します。
動的ライブラリ
一部の機能を動的ライブラリに移動します。コードをいつ使用するかを OS に決定させます。
将来の機能
現在実行されていない将来の機能に関連するすべてのコードを削除します。
データをデータファイルに移動
データ、特に静的変数またはグローバル変数の初期化に使用される値は、実行可能ファイル内のスペースを占有します。データをファイルに移動し、オンデマンドでデータをロードすることを検討してください。
これらの提案のいくつかは、実行可能ファイルを圧縮しますが、データ ファイルや動的ライブラリなどのアプリケーションは圧縮しません。これらはプログラムの実行に必要ですが、実行可能ファイルでは必要ない場合があります。
いくつかの提案は、アプリケーションのパフォーマンスを低下させます。申し訳ありませんが、これは時間とメモリのトレードオフです。メモリを節約できますが、実行時間は長くなります (フィールドのパッキングなど)。