0

http://www.codeproject.com/KB/cpp/fastdelegate2.aspx

上記の記事の導入部の 2 番目の段落では、次のように述べています。.. わかりませんか?実際にオブジェクトとメンバー関数をコピーして保存する必要がありますか? メンバー関数のアドレスを格納するだけではありませんか?

4

2 に答える 2

3

Boost.Function は、生の関数ポインタよりも一般的で強力です。特定のシグネチャで呼び出し可能なものなら何でも格納できます。ただし、その柔軟性に関連してストレージと実行時間にコストがかかります。

Boost.FunctionドキュメントのMiscellaneous Notesセクションでは、これについてもう少し詳しく説明していますが、要約すると:

  • Boost.Function オブジェクトは、メンバー関数ポインターと 2 つのデータ ポインターを内部的に格納します。
  • 特定のサイズより大きいファンクタを格納する場合、ヒープ割り当てが必要になる場合があります。
  • Boost.Function オブジェクトを呼び出すと、格納された内容に応じて、関数ポインターを介して 1 回または 2 回の呼び出しが行われます。

そうは言っても、私は Boost.Function を広範囲に使用してきましたが、プロファイリング時にストレージまたはランタイムのコストが実際に表示される状況は一度もありませんでした.

于 2011-04-19T17:23:10.497 に答える
0

いいえ、メソッドへのポインターだけでメンバー関数を呼び出すことはできません。その理由は、メソッドが呼び出されるオブジェクトであるコンテキスト( ) 内でメソッドが呼び出されるためです。thisメンバー関数ポインターしかない場合、メソッドをどのオブジェクトに適用する必要があるかわかりません。ただし、メンバー関数が の場合、静的メンバー関数はオブジェクトをインスタンス化せずに呼び出すことができるため、コンテキストstaticはありません。

したがって、メンバー関数を呼び出すには、関数へのポインターに加えて、メンバー関数の呼び出しが行われるコンテキストを定義するオブジェクトへの参照が必要です

これはあなたの質問に答えていますか?

于 2011-04-19T19:26:05.833 に答える