1

共有ライブラリ (または少なくとも Windows DLL) をリンクすると、多くの最適化が可能になり、すべての関数とクラスが一緒にスローされ、最適なパフォーマンスのために再編成されます (または、そう思う/期待します)。

静的ライブラリがオブジェクトの袋にすぎないのはなぜですか? オブジェクトファイル内に含まれる変数、関数、クラスなどのリストをリンカが (時間的にもパフォーマンス的にも) 持つ方がよいのではないでしょうか。静的ライブラリ内の相互に依存するものに対して既に実行された最適化パスから利益を得ますか?

静的ライブラリの作成にそれほど時間はかかりませんが (いずれにせよ限られた数の最適化のみが可能です)、このライブラリを使用した後続のビルド手順ははるかに高速/最適化されます。

PS: ここでは主にリンク時の最適化について話していますが、人気のあるすべてのツールチェーンがこの機能を誇りに思っているため、この質問が何らかの形で現れると確信しています。この質問に次のように答えないでください。それはいつものやり方であり、互換性は誰も変更しようとは考えていませんでした。それは私が探しているものではありません...

4

2 に答える 2

1

リンク時のコード生成とリンク前の最適化の間に競合があります。

そのライブラリから、関数 Foo を固定引数で 1 回だけ呼び出すとしますFoo(12)。LTCG では、Foo() の実装をその 1 つのケースに減らすことができるようになり、以前に収集した可能性のあるすべての最適化とコール ツリー情報が無効になります。

それを念頭に置いて、呼び出されない情報Foo()だけが引き継がれます。ただし、それがリンク段階の圧力を大幅に軽減する方法はわかりません。Bar()

順序付け情報も同様に、プロファイラーによる最適化の対象となります。どの関数がホット スポットであり、グループ化する必要があるかは、最終的なバイナリによってのみ決定できます。


一般的に、最適化は前の段階から離れてリンク段階に向かっているようです-そして、あなたが提案する最適化は実行可能ですが、これを使用できるシナリオの量と追加のシナリオの量に対して重み付けすると、おそらく報われないでしょう。コードの複雑さ (バグの数にほぼ比例)

于 2011-12-06T16:41:31.560 に答える
0

これらのファイルにはプロトタイプがあります。彼らはおそらくあなたが言及したリストのように振る舞います

于 2011-12-06T07:42:50.020 に答える