2016-12-02 33 views
9

Czy najnowsza wersja Delphi (Berlin/10.1/24) jest naprawdę potrzebna?Czy atrybut [Ref] dla parametrów rekordu stałego jest użyteczny?

Pytam o to, ponieważ online doc mówi:

stałe parametry mogą być przekazywane do funkcji przez wartość lub przez odniesienia zależności od konkretnego kompilatora używane. Aby zmusić kompilator do przekazywania stałego parametru przez odniesienie, można użyć dekoratora [Ref] ze słowem kluczowym const.

+1

można znaleźć odpowiedź tutaj: [Czy mogę zmusić 'const' przechodzić przez odniesienie (aka brakującej' in' parametru)] (http://stackoverflow.com/q/19094375/576719). –

+1

Oznacza to, że zapisy const <= SizeOf (wskaźnik) są przekazywane przez wartość. Jeśli chcesz się upewnić, że referencja jest przekazywana, użyj atrybutu [ref]. –

+0

OK, brzmi to bardzo rozsądnie i sprawia, że ​​myślę, że mogę zrezygnować z używania atrybutu Ref dla parametrów rekordu stałego. –

Odpowiedz

7

To wszystko, co opisano w dokumentacji. Użyłbyś [ref], gdybyś miał powód, aby wymusić przekazanie argumentu przez odniesienie. Jednym z przykładów, który mogę wymyślić jest dla współdziałania. Wyobraź sobie, że wywołanie funkcji API, które jest zdefiniowane następująco:

typedef struct { 
    int foo; 
} INFO; 

int DoStuff(const INFO *lpInfo); 

w Pascalu może chcesz zaimportować go tak:

type 
    TInfo = record 
    foo: Integer; 
    end; 

function DoStuff(const Info: TInfo): Integer; cdecl; external libname; 

Ale ponieważ TInfo jest mały, kompilator może zdecydować się przekazać struktura według wartości. Możesz więc dodać komentarz za pomocą [ref], aby zmusić kompilator do przekazania parametru jako referencji.

function DoStuff(const [ref] Info: TInfo): Integer; cdecl; external libname; 
+0

Dzięki za to. "Ale ponieważ TInfo jest małe, kompilator może wybrać przekazanie struktury według wartości." Widziałeś gdzieś to udokumentowane, czy zaobserwowałeś to w wynikach kompilacji? –

+0

Dokumentacja jest dość niejasna. Tylko 32-bitowa kompilacja systemu Windows ABI jest zdalnie [dokumentowana] (http://docwiki.embarcadero.com/RADStudio/en/Program_Control_ (Delphi)) przez Emba, a następnie niezbyt dobrze. Zasięg argumentów "const" jest, no, dobrze, niekompletny. Ale tak, rekordy mogą być popychane przez wartość lub przez odniesienie, w zależności od ich wielkości. Dla kodu w mojej odpowiedzi, bez '[ref]', dwa kompilatory Windows przejdą przez wartość. Dodaj kolejną 'int' do struktury i 32-bitowy kompilator przechodzi przez referencję, ale 64-bitowy kompilator według wartości. Dodaj kolejny i oba przekazuj według referencji. –

+0

ha to dokładnie to, czego próbowałem się dowiedzieć. Dzięki –