C ++プロジェクトに3年間取り組んだ後、実行可能ファイルは4MBに増えました。この空間がどこに向かっているのか見たいです。最大のスペースホッグが何であるかを報告できるツールはありますか?クラス別(クラス内のすべての関数)、テンプレート別(すべてのインスタンス化)、およびライブラリ別(C標準ライブラリとSTLにどれだけ属しているか?exe内の各ライブラリにどれだけあるか?)のサイズを確認すると便利です。
編集:注:私はWindowsでVisualC++を使用しています。
Linux ではnm
、実行可能ファイル内のすべてのシンボルを表示し、サイズの逆順で並べ替えるために使用できます。
$ nm -CSr --size-sort <exe>
オプション:
-C
C++ 名を分解します。-S
シンボルのサイズを示します。--size-sort
シンボルをサイズ順に並べ替えます。-r
ソートを逆にします。名前空間ごとまたはクラスごとに結果を取得する場合は、' '、' 'などgrep
の出力のみを取得できます。namespace::
namespace::class_name::
実行可能ファイルで定義されているシンボル(ライブラリのように他の場所で定義されているものではない) のみを表示する場合は、 を追加し--defined-only
ます。ただし、未定義のシンボルにはサイズがないため、サイズによる並べ替えでこれを処理する必要があります。
Windowsの場合、 COFFバイナリがサポートされているnm
ため、バイナリ ファイルで引き続き使用できるはずです。cygwin 経由でインストールするか、Windows 実行可能ファイルを Linux ボックスにコピーしてそこで実行することができます。nm
nm
nm
dumpbin
Windows 上のバイナリに関する情報をダンプするを試すこともできます。スイッチでシンボルの情報を取得できますが/SYMBOLS
、サイズに関する情報を直接提供しているようには見えません。
Visual Studio コンパイルの下の Windows では、この情報は .map ファイルにあります (.pdb の近くにあります)。
追加: .map ファイルにある装飾された名前を人間が読める形式に変換するには、Visual Studio に含まれているundname.exeユーティリティを使用できます。コマンドラインで個々の名前を受け入れるか、.map ファイルをフィードできます。
例えば、
Microsoft (R) C++ Name Undecorator
Copyright (C) Microsoft Corporation. All rights reserved.
Undecoration of "?push_back@?$mini_vector@U?$Point@U?$FixedPoint@$0O@H@Math@@@Math@@$05@@QAAXABU?$Point@U?$FixedPoint@$0O@H@Math@@@Math@@@Z" is
"public: void __cdecl mini_vector<struct Math::Point<struct Math::FixedPoint<14,int> >,6>::push_back(struct Math::Point<struct Math::FixedPoint<14,int> > const &)"
私は自分のために仕事をすることができませんでしたが、 Sizernm
という便利なツールを見つけることができました。Debug Interface Access ライブラリを使用して、Visual Studio によって作成されたデバッグ情報を読み取ります。サイトで説明されているように、使用するのは非常に簡単です。
Sizer.exe <path-to-exe-file>
。出力は stdout に送られるため、おそらくファイルにリダイレクトする必要があります。コード サイズはさまざまなセクションに分類され、関数、データ、クラスなどによってグループ化され、各セクションはコード サイズの降順で並べ替えられます。
リンク マップを取得するかdumpbin
、シンボルとサイズのリストを取得するために使用します。
厳密には必要のないものが大量に取り込まれている可能性があります。
追加: 満足のいく回答が得られましたか? 私は、人々がこのような問題にアプローチする方法が 2 つあることに気付きました。
個人的には後者の方が好きです。結果が早く得られます。
あなたはアプリが4MBだと言います。実際に必要なサイズが 1MB (またはそのようなサイズ) であるとします。つまり、マップ ファイルからルーチンを無作為に選択した場合、75% の確率で必要のないものになる可能性があります。含まれている原因を突き止め、本当に必要かどうかを確認してください。
あなたが示した例では、デバイスに依存しないビットマップをラップするクラスを見ました。アプリでそのクラスのインスタンスを見つけて、基本的な WIN32 ビットマップに置き換えることができます。きれいではありませんが、アプリのサイズを節約できます。
それからそれを続けてください。アプリは縮小されていますが、破片はまだ縮小されていないため、取り除く大きな破片ごとに、残りの破片がアプリのより大きな割合を占めるようになります。これにより、マップ ファイル内でそれらを見つけやすくなります。
コードだけを見ないでください。リソースは簡単に数メガバイトの増加を引き起こす可能性があります。