質問
私は一部の記事に関する当期純Vtable thunksを読んだとき、何がどこかにするthunksに使用できるフック/チェーンの手続きます。
では達成可能であ?
なんだろうけど、日本人にともできませんについては資源を説明するthunks.提案しょうか。
解決
実施の原サンクのvテーブルthunksは最後のリゾートがあります。何を目指し、その実現に必要なことのできるが達成されるラッパー機能といえます。
一般的には、サンクは、次の操作を実行します:
- 固定の入力パラメータ例えば、異なる形式)
- 通話の実施
- 清掃ステップ1/fixの出力パラメータ
の例を見るにしてください。って仲良Raymond陳と彼の議論のアジャスター thunks:
http://blogs.msdn.com/oldnewthing/archive/2004/02/06/68695.aspx
のサンクで使ったとして
[thunk]:CSample::QueryInterface`adjustor{4}':
sub DWORD PTR [esp+4], 4 ; this -= sizeof(lpVtbl)
jmp CSample::QueryInterface
などについても語っているクラスを実装したものと同じ方法を通して複数の通信インタフェースで複数のvです。(ままにしておいてくださいCOMのすべてがわかるでv-テーブルに直接、そのポインタを特定のインタフェースを含む関数へのポインタのすべてのメソッドのそのインタフェース ため.)
を実装する場合には二つの面と異なる方法は、特定のスロットに必要な複数のvです。でも、書くだけで、重複する方法、この方法のニーズを最大限に生かすこともこのポインタ.そのためには、コンパイラを生成する方法の修正が必要求、独自の実装です。
このサンクは以下の手順:
- 固定の入力パラメータ、すなわち、隠れた"こと"ポインタは、あります。)
- 通話を実施いたします
- 清掃活動:不要(下記参照)
ここでは、 jmp
指示が入れるようにしたいでしょう。通常、または機能を利用 call
, で戻すと思いま ret
お呼び出し側に返します。がありませんので清掃活動へのコンパイラは最適化がで実行の実施、実際の実装を返し計算書に戻る ご 呼び出し側に返します。これはあくまでも最適化ではなく、基本的な部分thunking.例えば、16/32ビットthunksに変換し、入力と出力のパラメータを16、32ビットをしていただくことをお勧めしていなけスキップの清掃活動ステップ;たもので call
, ない jmp
.
プレゼンの経験"シリーズ-ドレスローザ編に:が必要な場合いなど、何らかの jmp
最適化ができない書き直接C++やその他の高レベルの"言語の選択、見ていて気分が良いものを書き組み立ての言語のサンク.その他、ラッパーを書くときです。
正直、いるように聞こえるようにパフォーマンスの最適化は、ほとんどの時間(1)コンパイラにより最適化を考え、(2)ではないとして大きな改善いと思いますが。
他のヒント
さて、あなたは、サンクが解決策であることを読んで、問題を解決するために、今、あなたが探している?
通常、ハードコード - -サンクは、一般的に、マイナーな提供機能「転送」短いです。調整を
仮想テーブルのチャンクが、現時点ではウィキペディアの中で非常によく説明されています。彼らは一般的なパターンを使用します。実行時に計算/余分な作業を避けるために、小さな関数を生成
。私が見た他の場所/使用サンクます:
ウィンドウオブジェクトとウィンドウハンドルの関連付け:各々のウィンドウをサブクラス化するために、小さなサンクは、オブジェクト参照してウィンドウプロシージャを呼び出すオンザフライで生成され、サンクは、ウィンドウプロシージャとして使用されている
遅延ロードのDLL:サンクは、DLLは、任意の関数が呼び出された最初の時間にロードされているを確認します。
。トラッピングCOMインタフェース呼び出し:サンクは、診断のために注入点を提供し、実際のメソッドにジャンプ。