2011-07-04 15 views
5

デルファイが手続きへの言及をどのように表しているのか、誰もが知っていますか?私たちは "PROC" になったんは何例えばTProcと参照の内部(メモリ)表現

var 
    proc: TProc; 
... 
proc = procedure begin beep end; 

"メソッド変数"の場合、メモリ表現は "手続きアドレス"の場合は4バイト、 "オブジェクトアドレス"の場合は4バイトですが、 "手続きへの参照"は多少異なります。それを出す。

私がこれをしたい理由は、レガシーなコードがあり、参照との連携を実現したいからです。

誰でも知っていますか?

+1

http://alex.ciobanu.org/?p=27 –

+2

一般的に、「プロシージャへの参照」は特別なコンパイラ生成インターフェイス変数に保持されます。これにより、リファレンスが残っていないときにキャプチャされた変数を整理できるようにリファレンスカウントされます。あなたは '参照する 'ためにそれがどのように実装されているかを知る必要はありません。だからあなたはコンパイラを持っている。 –

答えて

10

メソッドリファレンスは、メソッドリファレンスと同じシグネチャを持つInvokeという1つのメソッドを持つCOMスタイルのインターフェイスとして実装されています。

のでTProcは次のようになります。

type 
    TProc = interface(IInterface) // so inherits QI, AddRef, Release 
    procedure Invoke; 
    end; 

DelphiはC++の製品との相互運用性を持っているとしてそれは、聞いて、有効な質問ですね。既存の参照カウント型とイディオム(COMの有効期間ルール)を使用することにより、メソッド参照レベルでのC++との相互運用が可能になります。

匿名メソッドは、メソッド参照インタフェースと同型のインターフェイス、つまりまったく同じシェイプを実装するが、同じシンボリックアイデンティティではないインターフェイスを実装する隠しクラスを生成します。隠されたクラスは、インタフェースを複数回実装する必要があるかもしれないので、メソッド参照インタフェースを直接実装しません(単一のブロックは、すべて同じメソッド参照型の場所に割り当てられた複数の匿名メソッドを含む場合があります)。

+0

知っておいた。バリー・ケリーありがとう。 – Nedko

+1

@バリー:いつものように面白い!私は最後の段落を何度も読まなければならなかったが、私は理解していると思う。これは愚かな質問かもしれませんが、私は恐怖ですが、括弧で囲まれたセクションは、メソッド参照隠しクラスの1つのインスタンスが複数の匿名メソッドを実装するために作成されていることを意味します。他の範囲)?それは複雑ですね:) –

+2

@Davidの匿名メソッドはローカル変数を取得することがあります。すべて同じ変数をキャプチャするいくつかの匿名メソッドがある場合、それらは状態を共有する必要があります。 Delphiの実装では、ブロック内の匿名メソッドに関連付けられているすべての状態(キャプチャされた変数)が同じオブジェクトに格納されます。すべての匿名メソッドはこのオブジェクトのクラスのメソッドに変換され、キャプチャされた各変数はフィールドに変換されます。 –

関連する問題