2

ウィキペディアによると、メッセージの受け渡しとメソッドの呼び出しの違いは、「メッセージの受け渡しでは、既存の引数を新しいメッセージの一部にコピーするために、各引数に十分な空きメモリが必要です」ということですが、メソッドではアドレスのみを呼び出します。の引数が渡されます。

メッセージパッシングは、すべての引数が構造体または値型である通常のメソッドの呼び出しとどのように違うのですか?つまり、呼び出し先がそれらを使用できるようにするには、それらをすべて完全にスタックにプッシュする必要がありますか?

4

3 に答える 3

10

実際の関数呼び出しが行われると、違いはありません。メッセージの受け渡しとメソッドの呼び出しの違いは、リンクにあります。c や c++ などの言語の場合、関数呼び出しはコンパイル時にリンカーとリンクされます (ランタイム サポートを必要とする仮想関数を除く)。Objective-C や smalltalk などのメッセージング システムを使用する言語では、どの関数が実行時まで実行されるかを保証できません。ランタイムは、オブジェクトがメッセージで表された関数を実際に実装しているかどうかを判断します。実装されていない場合、クラスは通常、メッセージを別のオブジェクトに転送するか、例外をスローします。ただし、クラスがそれを実装する場合、ランタイムは実際の関数のアドレスを決定します。

全体として、メッセージはメソッドを直接呼び出すことと同じですが、コンパイル時にリンクされるのではなく、呼び出される正確な関数がランタイムによって検出される点が異なります。

于 2011-03-27T20:51:31.560 に答える
7

Objective-C 呼び出し ABI は一般に (必要に応じて独自の ABI を作成することもできます) 100% 純粋な C ABI です。パラメータと戻り値は、通常の C 呼び出しサイトとまったく同じように処理されます。

主な違いの 1 つは、Objective-C 呼び出しサイトが常に のバリアントとしてコンパイルされobjc_msgSend()、最初の 2 つのパラメーターが常にターゲット オブジェクト ( self) と呼び出されるセレクター ( _cmd) であることです。これが、動的ディスパッチ (実行時にメソッドをオーバーライドする機能など) を可能にするものであり、Objective-C は C++ (または同様のもの) とはかなり異なります。

objc_msgSend()(ランタイムとコンパイラのチーム以外で)知っておく必要があるかもしれない以上のことについて、私は4 部構成のシリーズを書き、命令ごとにobjc_msgSend().

于 2011-03-27T20:51:50.560 に答える
3

リンク先のページでは、SOAP や CORBA のようなリモート メッセージ パッシングについて説明しています。これは、Objective-C のメッセージ パッシングとは (もしあれば) あまり関係がありません。(はい、ウィキペディアの Objective-C の記事はそれにリンクしています - そのリンクは実際にはそこにあるべきではありません。)

メッセージの送信とメソッドの呼び出しの違いは、前者が非常に動的であることです。メッセージ名を処理する関数へのメッセージ名のマッピングは実行時に行われますが、メソッド呼び出しはコンパイル時に関数にバインドされます。

これにより、C++ では容易に実行できないタイプの動的プログラミングが可能になります。たとえば、Objective-C ランタイムは -forwardInvocation: を探し、オブジェクトが指定されたメッセージに直接応答しない場合にそれを呼び出します。これにより、プロキシであるクラスのすべての詳細を知る必要なく、他のクラスの「代役」として機能できる NSProxy などのクラスが可能になります。

もう 1 つの例は、実行時にクラス定義を拡張することです。アプリケーションを再コンパイルしたり、再起動したりする必要はありません。必要なのは、実装関数をランタイムに登録することだけです。

さらに別の例は、言語の架け橋の支援です。たとえば、私自身の Cocoa/Perl ブリッジには、Perl オブジェクトに送信されたメッセージを処理する実装関数が 1 つしかありません。これは、メッセージ名を調べて、応答でどの Perl 関数を呼び出す必要があるかをその場で計算します。

編集: ちなみに、特定のメッセージを処理する関数が解決されると、その関数を呼び出すメカニズム (つまり、引数を渡すためのスタック フレームの構築) は、名前と関数のバインディングが行われた場合とまったく同じです。コンパイル時に。引数が異なる方法で渡されるという概念は、トピック外のウィキペディアの記事によって導入された単なるニシンです。

于 2011-03-27T20:49:17.787 に答える