2011-07-04 10 views
5

Czy ktoś tutaj wie, w jaki sposób Delphi reprezentuje odniesienie do procedury?Wewnętrzna (pamięć) reprezentacja TProc i referencje w ogóle

np

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

co mamy w "obrady"?

Wiem, że dla "zmiennej metody" reprezentacja pamięci wynosi 4 bajty dla "adresu procedury", po którym następują 4 bajty dla "adresu obiektu", ale dla "odniesienia do procedury" jest nieco inna i nie mogę do końca to.

Powodem, dla którego chcę, jest to, ponieważ mam jakiś staroświecki kod, który chcę, aby działał z referencjami.

Czy ktoś wie coś na ten temat?

+1

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

+2

Ogólnie "odwołanie do procedury" odbywa się w specjalnej zmiennej interfejsu generowanej przez kompilator. Gwarantuje to, że jest to odniesienie zliczone, aby wychwycone zmienne mogły zostać usunięte, gdy nie ma żadnych referencji. Nie musisz wiedzieć, w jaki sposób jest on implementowany, aby pracować z 'odniesieniem do'. Właśnie dlatego masz kompilator. –

Odpowiedz

10

Odwołania do metod są implementowane jako interfejs w stylu COM za pomocą jednej metody o nazwie Invoke, która ma ten sam podpis, co odwołanie do metody.

Więc TProc wygląda następująco:

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

Jest to ważne pytanie zadać, jak Delphi ma współdziałanie z produktem C++. Korzystając z wcześniej istniejącego typu i idiomu zliczanego odsyłającego (reguły życia COM), możliwe jest współdziałanie z C++ na poziomie odniesienia metody.

Metody anonimowe generują ukrytą klasę, która implementuje interfejs izomorficzny do interfejsu odniesienia metody, tj. O dokładnie tym samym kształcie, ale nie o tej samej symbolicznej tożsamości. Ukryta klasa nie implementuje bezpośrednio interfejsu odnośnika metod, ponieważ może zaistnieć konieczność implementacji interfejsu wiele razy (pojedynczy blok może zawierać wiele anonimowych metod przypisanych do lokalizacji tego samego typu odwołania do metody).

+0

Dobrze było wiedzieć. Dziękuję Barry Kelly. – Nedko

+1

@ Barry: Interesujące jak zawsze! Kilka razy musiałem przeczytać ostatni paragraf, ale myślę, że rozumiem. To może być głupie pytanie, obawiam się, ale: czy sekcja w nawiasie oznacza, że ​​jedna instancja klasy ukrytej odwołań do metody jest tworzona w celu implementacji wielu anonimowych metod, gdzie kilka z nich jest zdefiniowanych w tej samej normalnej procedurze (lub tej samej normalnej procedurze). inny zakres)? To brzmi ... skomplikowane :) –

+2

@Dane metody anonimowe mogą przechwytywać zmienne lokalne; kiedy masz kilka metod anonimowych, wszystkie przechwytujące tę samą zmienną, muszą się dzielić stanem. Implementacja Delphi umieszcza cały stan (tj. Przechwycone zmienne) związane z metodami anonimowymi w bloku w ten sam obiekt; każda anonimowa metoda zostaje przekształcona w metodę na tej klasie obiektu, podczas gdy każda przechwycona zmienna zmienia się w pole. –