1)DLL関数の呼び出しは常に追加の間接ジャンプを使用するという事実に基づいています。今日、これはごくわずかです。DLLの内部では、位置に依存しないコードを生成できないため、i386 CPUにいくつかのオーバーヘッドがあります。amd64では、ジャンプはプログラムカウンターに関連している可能性があるため、これは大きな改善です。
2)これは正しいです。プロファイリングに基づく最適化により、通常は約10〜15%のパフォーマンスを獲得できます。CPU速度が限界に達したので、実行する価値があるかもしれません。
追加します:(3)リンカは、よりキャッシュ効率の高いグループに関数を配置できるため、コストのかかるキャッシュレベルのミスが最小限に抑えられます。また、特にアプリケーションの起動時間に影響を与える可能性があります(Sun C ++コンパイラで見た結果に基づく)
DLLを使用すると、デッドコードの除去を実行できないことを忘れないでください。言語によっては、DLLコードも最適ではない場合があります。コンパイラはクライアントが上書きしているかどうかを知らないため、仮想関数は常に仮想関数です。
これらの理由により、DLLが本当に必要ない場合は、静的コンパイルを使用してください。
編集(ユーザーのアンダースコアによるコメントへの回答)
これは、位置に依存しないコードの問題に関する優れたリソースです。http://eli.thegreenplace.net/2011/11/03/position-independent-code-pic-in-shared-libraries/
説明されているように、x86は15ビットジャンプ範囲以外には何のAFAIKも持っておらず、無条件ジャンプや呼び出しのためのものではありません。そのため、32Kを超える(ジェネレーターからの)関数は常に問題であり、埋め込みトランポリンが必要でした。
しかし、Linuxのような一般的なx86 OSでは、.so / DLLファイルがgcc
スイッチで生成されていないかどうかを気にする必要はありません-fpic
(間接ジャンプテーブルの使用を強制します)。そうしないと、通常のリンカがコードを再配置するようにコードが修正されるだけです。ただし、これを行うと、コードセグメントが共有不可になり、コードをディスクからメモリに完全にマッピングして、使用する前にすべてを操作する必要があります(ほとんどのキャッシュを空にし、TLBにヒットします)など。これが遅いと考えられたとき。
だからあなたはもう何の利益もないでしょう。
どのOS(SolarisまたはFreeBSD)がUnixビルドシステムで問題を起こしたのか思い出せません。これを行っていないだけで、に適用-fPIC
するまでなぜクラッシュするのか疑問に思いましたgcc
。