1. ホーム
  2. c++

[解決済み] C++のダイナミックディスパッチとレイトバインドの違いは何ですか?

2023-08-01 11:55:11

質問

最近、Dynamic Dispatch について読んだことがあります。 ウィキペディア を読みましたが、C++における動的ディスパッチとレイトバインドの違いを理解することができませんでした。

それぞれの仕組みはどのような時に使われるのでしょうか?

Wikipediaからの正確な引用です。

動的ディスパッチは、レイトバインディング(ダイナミックバインディングとも呼ばれる)とは異なります。操作の選択という文脈では、バインディングは名前と操作を関連付ける処理を指します。ディスパッチとは、名前がどの操作を指すかを決定した後に、その操作の実装を選択することを指します。動的ディスパッチでは、コンパイル時に名前を多相な操作にバインドしても、実行時まで実装を選択しない(C++の動的ディスパッチがそうなっている)。しかし、レイトバインドは動的ディスパッチを意味します。なぜなら、名前が参照する操作を選択するまで、ポリモーフィック操作のどの実装を選択するかができないからです。

どのように解決するのですか?

これに対するかなりまともな回答は、実際には、次のような、遅いバインディングと早いバインディングに関する質問の中に組み込まれています。 programmers.stackexchange.com にあります。 .

要するに、レイトバインディングとは オブジェクト -側、動的ディスパッチは機能側を指します。レイトバインディングでは タイプ は実行時のバリアントです。dynamic-dispatchでは、実行される関数やサブルーチンがバリアントとなります。

C++では、実際にはレイトバインディングはありません。 は既知だからです。 (必ずしも継承階層の最後ではなく、少なくとも正式な基底クラスまたはインターフェイス) が知られているからです。しかし、私たちは する は仮想メソッドとポリモーフィズムによる動的ディスパッチを持っています。

私が提供できる遅延結合の最も良い例は、Visual Basicの型付けされていない"object"です。実行時環境はあなたのために遅延結合の重い仕事をすべて行います。

Dim obj

- initialize object then..
obj.DoSomething()

というメソッドの名前付き検索を実行するために、コンパイラはランタイムエンジンのために適切な実行コンテキストを実際にコード化します。 DoSomething と呼ばれるメソッドの名前付き検索を行い、適切にマッチするパラメータで発見された場合、基礎となる呼び出しを実際に実行します。実際には 何か を継承している) ので、オブジェクトの型は既知です。 IDispatch をサポートし GetIDsOfNames() など)。しかし、限り 言語 タイプ はコンパイル時には全く不明であり、その変数が DoSomething がどのようなメソッドであるのかさえもわかりません。 obj は実際に をランタイムが実行点に到達するまで

C++の仮想インターフェイスなどがどのようなものかはすでにご存知だと思いますので、わざわざダンプする必要はありません。C++ 言語が単にこれを行うことができないことは明らかだと思います。C++は強く型付けされています。それは ができます。 (は多相仮想メソッド機能によって動的ディスパッチを行うことができます(そして、明らかに行っています)。