7

動的にロードされるライブラリ用のプラットフォームに依存しないラッパーを実装中です。もちろん、ライブラリから関数をロードするときは、将来の使用のためにそれらをポインタとして保存する必要があります。通常の関数ポインターの代わりに、boost::function を使用することを考えました。確かに、コンパイル時間が長くなりますが、それは私が恐れていることではありません。それよりも:

保存された関数を呼び出すときに、boost::function によって導入されるオーバーヘッドはどれくらいですか? ありますか?それはどれくらい大きいですか?

そのような関数を時々呼び出す場合、オーバーヘッドはあまり発生しないと思いますが、頻繁に呼び出される関数はどうですか? glVertex(ロードされた GL ライブラリの極端な例)。パフォーマンスにどの程度影響しますか?

ソースダイビングブーストはあまり答えませんでした:>.

また、コンパイラに依存する場合は、主に GCC と MSVC に興味があります。

4

2 に答える 2

5

Boostのドキュメントに記載されているように、ほとんどの場合、を呼び出すboost::functionと関数ポインタを介した1回の呼び出しのコストが発生します。言い換えれば、とにかく関数ポインタを使用しなければならない場合、それは洗浄であり、無料で拡張機能の束を手に入れることができます。

于 2010-01-02T00:13:41.193 に答える
1

boost :: functionはそれをtr1にしたので、それは最新のコンパイラではstd :: tr1 :: functionであり、本当に最新のコンパイラではstd::functionです。

いずれにせよ、あなたが観察したように、std :: functionは作成(オブジェクトのコピーの作成を含む)のためにゼロ以外のオーバーヘッドを持っています。理論的には、呼び出し用の生の関数ポインターと同じオーバーヘッドが必要です。つまり、1つのレベルの間接参照がありますが、実際には、スマートコンパイラはそのレベルの間接参照をインライン化できます。

もちろん、std :: functionに格納できるものがあり、関数ポインターに適合または格納することはできません。

于 2010-01-02T00:14:23.143 に答える