web-dev-qa-db-ja.com

「サンク」とは何ですか?

プログラミング(特にC++ドメイン)で使用されているのを見たことがありますが、それが何であるかはわかりません。おそらくそれはデザインパターンですが、私は間違っている可能性があります。誰でもサンクの良い例を挙げることができますか?

120
fbrereto

thunkは通常、関数として呼び出され、小さなことを行い、呼び出し元に戻る代わりにJUMPsを別の場所(通常は関数)に呼び出す小さなコードを指します。 JUMPターゲットが通常の関数であると仮定すると、戻ると、サンクの呼び出し元に戻ります。

サンクを使用すると、多くの便利なものを効率的に実装できます

  • プロトコル変換-ある呼び出し規則を使用するコードから別の呼び出し規則を使用するコードに呼び出す場合、thunkを使用して引数を適切に変換できます。これは、戻り規則に互換性がある場合にのみ機能しますが、多くの場合そうです

  • 仮想関数の処理-C++で多重継承ベースクラスの仮想関数を呼び出す場合、thisポインターを修正して適切な場所を指すようにする必要があります。 thunkはこれを行うことができます。

  • 動的なクロージャー-動的なクロージャーを作成するとき、クロージャー関数は作成されたコンテキストに到達できる必要があります。小さなthunkを構築して(通常はスタック上に)、いくつかのレジスタにコンテキスト情報を設定し、クロージャーの関数を実装する静的なコードにジャンプします。ここでのサンクは、呼び出しサイトによって提供されない関数に1つ以上の隠された追加の引数を効果的に提供します。

120
Chris Dodd

Wordサンクには、コンピューターサイエンスで少なくとも3つの関連する意味があります。 「サンク」には次のものがあります。

  • 遅延計算を実行するためのコード(クロージャに類似)
  • 一部の仮想関数テーブル実装の機能(ラッパー関数に類似)
  • 通常、互換性の理由から、システム固有のフォームから別のフォームへのマシンデータのマッピング

私は通常、3番目のコンテキストで使用されるのを見ました。

http://en.wikipedia.org/wiki/Thunk

78
Robert Harvey

C++などのオブジェクト指向言語用の一部のコンパイラは、多重継承または仮想継承が存在する場合の仮想関数呼び出しの最適化として「サンク」と呼ばれる関数を生成します。

から取得: http://en.wikipedia.org/wiki/Thunk#Thunks_in_object-oriented_programming

17
OscarRyz

サンクという用語は、元々 Royal Radar Establishment コンパイラでの名前によるパスの実装で使用されるメカニズムを指していました ALGOL6 コンパイラー。一般的には、明らかに静的なオブジェクトを参照するときに動的な動作を誘発する方法を指します。この用語はブライアン・ウィッチマンによって考案されました。ブライアン・ウィッチマンは、名前渡しを説明するよう求められたとき、「メモリから値をロードし、突然-サンク-そこに式を評価しています」と言いました。

サンクはハードウェアに配置されています(KDF9、バローズメインフレームを参照)。それらをソフトウェアで実装する方法はいくつかありますが、すべてマシン、言語、コンパイラ固有です。

この用語は、名前によるパスを超えて一般化されるようになり、見かけ上または名目上静的なデータ参照が動的な振る舞いを誘発する状況を含むようになりました。関連用語には、「トランポリン」と「未来」が含まれます。

17
Ivan Godard

使用にはかなりのバリエーションがあります。ほぼ普遍的に、サンクは(少なくとも概念的には)異常に小さくシンプルな関数です。通常、何らかのアダプター(何らかのデータ、別の機能など)に対する正しいインターフェースを提供しますが、少なくとも他のことはほとんど行われていないように見えます。

(少なくとも通常使用される)構文糖は、人間の読者が見たいように見えるようになっていることと、サンクはコンパイラが望むように見えるようにすることを除いて、構文糖の形にほとんど似ていますそれを参照してください。

7
Jerry Coffin

これを調べてみますが、thunkingは、レガシー16ビットコードを実行するために32ビットプロセッサで採用されているプロセスだと思いました。

私は、あなたが話す速さを制限する方法と、口のきけない人と話すときに使用する言葉の類推としてそれを使用していました。

ええ、それはウィキペディアのリンクにあります(私のnerdalogyではなく、32ビットに関する部分)。

https://en.wikipedia.org/wiki/Thunk

相互運用性サンクに関する文献の多くは、MS-DOS、OS/2、[8] Windows [9] [10]、および.NETなどのさまざまなWintelプラットフォームと、 16ビットから32ビットのメモリアドレス指定。顧客が1つのプラットフォームから別のプラットフォームに移行するにつれて、古いプラットフォーム用に作成されたレガシーソフトウェアをサポートするためにサンクが不可欠になりました。

(強調は私によって追加されました)

5
MusiGenesis

この質問は既にSOで質問されています。

Schemeまたは一般的に使用される「サンク」とは何ですか?

私が言えることから、それはラムダ文に似ており、評価する必要があるまで値を返したくないかもしれません。または、プロパティゲッターと比較することもできます。プロパティゲッターは、値を返すためにいくつかのコードを実行しますが、変数のように見えるインターフェイスフォームを持ちますが、継承またはコンパイル時または環境特性に基づいて実行時に値を評価して返す関数ポインタを交換することにより。

4
Jon Davis

歴史的に知られている事実上の使用法に一致するこの用語の一般的な「コンピューターサイエンス」の定義を見つけられないことに、私は悩みました。最初に実際に出会ったのは、OS/2の時代と16-32ビットへの移行で、実際にどこで呼ばれたかを思い出すことができます。 「サンク」は、今日のアプリケーションでは皮肉のようです。

私の大まかな一般的な理解は、サンクは、言及された歴史的なケースのように、システム間で基本的な境界を何もしないかルーティングするスタブルーチンであるということです。

したがって、感覚は、ある環境から別の環境に落とされて「サンク」サウンドを(比/的に/直mileとして)共感するようなものです。

4
仁 人 卷

カイルシンプソン 定義ごとに、サンクtimeのコンポーネントを抽象化する方法です非同期コードのうち。