1

「メディア プレーヤー」の部分については、実行時にロードされる単純な動的ライブラリであるプラグインが明らかに使用されることを除いて、詳しく説明しません。これらのプラグインを依存関係に動的にリンクすることも、静的にリンクすることもできます。どちらにも長所と短所があります。Linux は共有ライブラリを使用するため、ここでは数えません。

共有ライブラリを使用する唯一の利点は、ライブラリをプログラムから独立して更新できることです。Windows では、ライブラリがそれを使用するアプリケーションの隣にあるため、これが利点になることはめったにありません (公式の C++ ABI がないため)。Windows では、DLL 地獄を減らし、C ライブラリを共有するために、SxS を使用する必要がありますが、これはあまり良い市民ではありません。

静的ライブラリに関しては、リンク時の最適化という大きな利点が 1 つあります。これらはかなり前から ICC と VC++ でサポートされており、GCC にはそれらのブランチがあります。私はおそらく Windows で VC++ を使用するので、コンパイラー (実際の「コンパイラー」は C++ を中間言語に変換するだけなので、ここではコンパイラーは「リンカー」です) がコーディングし、この方法で多くのものを最適化できます。これは私が傾いているオプションです。

私の質問は、私の特定のケースではどれが最適でしょうか?

この問題では Linux (OS X の知識はありませんが) や複数のインスタンス (同じメディア プレーヤーを 2 回実行するのは誰ですか?)、バイナリ互換性 (私がアプリケーションと一緒にすべてを配布します) または更新が簡単です (Windows では、更新を配布するために非常に効率的なバイナリ diff パッチャーを使用します)。

4

1 に答える 1

0

あなたの「特定の」ケースが何であるかは完全にはわかりません。

「メディアプレーヤー」が、すべてのメディアプレーヤーを一度に更新する、または完全な監視下で任意のプラグインを一度に更新する、よく知られた一意のクライアント(またはクライアントの小さなセット)を対象としている場合は、静的ライブラリを使用します。

そうでない場合は、ダイナミックライブラリを使用します。最適化は優れていますが、顧客/ユーザーの満足度ほど良くはありません。xxxライブラリを最新バージョンに更新することほど悪いことはなく、突然のことがすべて機能しなくなります。いつどのように更新を行うかを制御できない場合は、できる限り柔軟に行ってください。

コメントへの回答:

通常、ダイナミックライブラリはマイナーリリースバージョンに対して下位互換性がありますが、静的リンクは具体的なバージョンに依存している可能性があり、別のリリースにリンクしようとすると壊れます。ダイナミックリンクを使用すると、使用する呼び出しが変更されない限りプログラムが機能する可能性がありますが、静的リンクはライブラリ内の関数オフセットの変更に依存する可能性があります。

たとえば、静的ライブラリは、実行時に静的オフセットでプロセスのアドレス空間にロードされる場合があります。もちろん、このオフセットを知っていると特定の最適化が可能になりますが、ライブラリを更新する場合は、そのライブラリを使用してすべてのプラグインを更新するか、更新されていないプラグインが機能しない可能性があります(関数オフセットが非常によく変更されている可能性があるため)。

実行時にロードすると仮定しますが、静的リンクという名前を付けることができる場合は、各プラグインにライブラリがあり、「共有」はありません。

于 2009-09-23T13:58:45.877 に答える