13

私には大きな問題があります。プロジェクト全体で使用される共通のライブラリがあります。このライブラリは と を集中的に使用boost.spiritboost.fusionます。残念ながら、ライブラリは約です。サイズは700MB。すべてのboost.spirit重いコードが使用され、うまく機能します。出力サイズを縮小するには、どのような手順を実行できますか? どのテンプレートのインスタンス化がスペースの大部分を浪費しているかを判断するのに役立つツールはありますか?

最初に、すべてのスピリット対応コードを cpp ファイルに移動することにしました。次に、さまざまなコンパイラ フラグを試して、サイズを最適化します。他に何をすべきかわかりません。

アップデート(詳細)

GNU ツールチェーンを使用しています。巨大なライブラリは、実際には静的ライブラリです。この 700Mb ライブラリを使用する実行可能ファイルのサイズは 200Mb です。コードの少なくとも半分は *.h ファイルにあります。一部のboost.spirit文法 (非常にテンプレートが多いもの) も *.h ファイルにあります。

乾杯!

4

4 に答える 4

5

スピリット認識コードを.cppファイルに移動することは、最初の良いステップですが、ヘッダファイルにスピリット文法があると述べているように、不完全かもしれません。

  1. 文法やルールがライブラリの外にエクスポートされないようにしてください。include典型的な/ディレクトリがある場合は、srcそれらのファイル (ヘッダーであっても) をディレクトリ内に移動しますsrc

  2. これらすべてのシンボルをライブラリの内部としてマークします。ライブラリの外からアクセスできないようにする必要があります。コンパイラに応じて特定のプラグマ/属性があり、gcc ルックアップで可視性属性: __attribute__ ((visibility ("internal"))). これは、コンパイラがそれに応じてそれらを最適化するのに役立ちます。特に、コンパイラは、この関数アドレスが取得された場合に備えて、特定の呼び出しサイトでインライン化されている場合でも、関数のコードを発行する場合があります。ただし、内部可視性では、コードがオブジェクトを離れないことがわかっているため、関数を省略できます。

  3. 同一の関数本体を融合するためのフラグを覚えているようですが、再び見つけることができないようです...

于 2012-10-14T15:25:32.097 に答える
4

--ffunction-sections各関数を独自のセグメントに配置します。それ自体では役に立ちませんが、リンカは未使用のセクションを で削除できます--gc-sections。これ--ffunction-sectionsがないと、ソースファイル全体が使用されていない場合、つまり非常に細かい粒度の場合にのみ機能します。

明らかに、マシューが言及した可視性属性が必要です。それ以外の場合、ライブラリ内のすべての関数は、可視であるため「使用」されます。

于 2012-10-15T08:35:59.060 に答える
2

いくつかの提案:

  • 可能であれば、同じテンプレートのインスタンス化を再利用してみてください(たとえば、astd::vector<int>std::vector<float>は同じ内部構造を持ち、両方とも要素データを不透明な4バイトのBLOBとして扱うことができるため、一方を他方に委任できます)。 、そして正しい型にキャストバックするモノラッパーとして機能するため、ベクトルの内部は2つではなく1つの型に対してのみインスタンス化する必要があります。

  • 別のコンパイラを試してください。一部のコンパイラは、プログラムのセマンティクスに影響を与えない同一のテンプレートのインスタンス化を再利用しますが、他のコンパイラはより保守的です。

  • ライブラリからエクスポートされるものに注意してください。エクスポートされておらず、内部で参照されていないシンボルは、リンカーによって削除できます。(もちろん、静的ライブラリを構築している場合、実行可能ファイルにリンクされるまでこれは開始されません。ライブラリ自体のサイズを小さくするには、代わりに動的ライブラリを作成してみてください)

しかし、最終的には、テンプレートの負荷が少ないライブラリを使用する必要があるように思われます。(または、現在持っているよりも単純なパーサーを作成します)

于 2012-10-14T13:42:19.297 に答える
2

ここで議論されています:なぜ私のC++出力実行可能ファイルはとても大きいのですか?

基本的に、デバッグ シンボルの検索、リンクの依存関係の順序付け、最適化など...

于 2012-10-14T13:46:55.547 に答える