2

私はPOSIX dlopen/ dlsymAPIを使用して、実行時に動的ライブラリをロードし、それらのライブラリから名前で関数を呼び出しています。

dlsymどこかに結果を保存することは、パフォーマンス面で良い考えですか? それとも、dlsym は既に独自のキャッシングを行っており、別のレイヤーを追加することは役に立たないか、有害でさえありますか? 関数は潜在的に何度も呼び出される可能性がありますが、どの関数が呼び出されるか、またはどのくらいの頻度で呼び出されるかを事前に知る方法は実際にはありません。

ありがとう!

4

1 に答える 1

3

このdlsym関数はキャッシュを行いません。これは単に ELF シンボル テーブルにアクセスしているだけです (あまりうまく実装されていないハッシュ テーブルを使用しています)。

dlsym同じ名前とライブラリを何度も (たとえば、何百万回も)呼び出すことは避けるべきだと思います。

怠惰な手法を使用する場合があります。たとえば、dlsym呼び出しで使用される名前とライブラリを (構造体またはクラスの一部で) dlsym-ed 関数ポインターと一緒に配置しdlsym、そのポインターが null の場合にのみ呼び出します。

dlsymまた、できるだけ早く失敗をキャッチしたい場合もあります。

FWIW、あなたは何度も電話をかけることができdlopenますdlsym特に、私のmanydl.cの例が示すように、Linux では何十万ものdlopen-ed 共有ライブラリーを持つことができます。ただし、内部に -ed 関数のアクティブな呼び出しフレームがまだある場合は、ライブラリを -ing しないでください。実際には、呼び出すことはなく、プログラムは引き続き動作します (わずかなプロセス アドレス空間リークが発生します)。 dlclosedlsymdlclose

于 2012-05-08T14:04:44.447 に答える