2011-07-04 1 views
5

Qualcuno qui sa come Delphi rappresenta un riferimento alla procedura?Rappresentazione interna (memoria) di TProc e riferimenti a tutti

ad esempio

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

Cosa abbiamo in "proc"?

So che per "variabile di metodo" la rappresentazione della memoria è di 4 byte per "indirizzo di procedura" seguito da 4 byte per "indirizzo oggetto", ma per "riferimento alla procedura" è un po 'diverso e non riesco a capire fuori.

La ragione per cui voglio questo è perché ho un codice legacy che voglio farlo funzionare con i riferimenti.

Qualcuno sa qualcosa a riguardo?

+1

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

+2

In generale, il riferimento alla procedura è contenuto in una speciale variabile di interfaccia generata dal compilatore. Ciò assicura che venga conteggiato il riferimento in modo che le variabili catturate possano essere riordinate quando non vi sono riferimenti. Non è necessario sapere come è implementato per lavorare con 'reference to'. Ecco perché hai un compilatore. –

risposta

10

I riferimenti di metodo vengono implementati come un'interfaccia in stile COM con un unico metodo chiamato Invoke, che ha la stessa firma del riferimento al metodo.

Così TProc assomiglia a questo:

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

E 'una domanda valida a chiedere, come Delphi ha l'interoperabilità con il prodotto C++. Utilizzando un tipo e un idi di conteggio di riferimento preesistente (regole di durata della COM), è possibile eseguire l'interoperabilità con C++ al livello di riferimento del metodo.

I metodi anonimi generano una classe nascosta che implementa un'interfaccia isomorfa all'interfaccia di riferimento del metodo, ovvero esattamente la stessa forma, ma non con la stessa identità simbolica. La classe nascosta non implementa direttamente l'interfaccia di riferimento del metodo perché potrebbe dover implementare l'interfaccia più volte (un singolo blocco può contenere più metodi anonimi tutti assegnati a posizioni dello stesso tipo di riferimento al metodo).

+0

Era bello saperlo. Grazie, Barry Kelly. – Nedko

+1

@Barry: Interessante come sempre! Ho dovuto leggere l'ultimo paragrafo più volte, ma penso di capire. Questa potrebbe essere una domanda sciocca, temo, ma: la sezione tra parentesi significa che l'unica istanza di una classe di riferimento di metodo nascosta viene creata per implementare più metodi anonimi, dove molti sono tutti definiti nella stessa procedura normale (o stessa altro scopo)? Sembra ... complicato :) –

+2

@David metodi anonimi possono catturare variabili locali; quando hai diversi metodi anonimi che catturano la stessa variabile, devono condividere lo stato. L'implementazione di Delphi mette tutti gli stati (cioè le variabili catturate) associati ai metodi anonimi in un blocco nello stesso oggetto; ogni metodo anonimo viene trasformato in un metodo sulla classe di questo oggetto, mentre ogni variabile acquisita diventa un campo. –