2016-12-02 3 views
9

С последней версией Delphi (Berlin/10.1/24), действительно ли необходим атрибут [Ref]?Используется ли атрибут [Ref] для параметров константной записи?

Я спрашиваю это потому, что online doc говорит:

Постоянные параметры могут быть переданы в функцию по значению или по ссылке , в зависимости от конкретного используемого компилятора. Чтобы заставить компилятор передать постоянный параметр по ссылке, вы можете использовать декоратор[Ref] с ключевым словом const.

+1

Вы можете найти ответ здесь: [Могу ли я заставить 'const' пройти по ссылке (он же недостающего' в' параметра)] (http://stackoverflow.com/q/19094375/576719). –

+1

То есть константные записи <= SizeOf (указатель) передаются по значению. Если вы хотите убедиться, что ссылка передана, используйте атрибут [ref]. –

+0

ОК, что звучит очень разумно, и заставляет меня думать, что я могу отказаться от использования атрибута Ref для параметров записи const. –

ответ

7

Это почти так, как описано в документации. Вы должны использовать [ref], если у вас есть причина для принудительного применения аргумента, передаваемого по ссылке. Один из примеров, о котором я могу думать, - это вмешательство. Представьте, что вы вызываете функцию API, которая определяется следующим образом:

typedef struct { 
    int foo; 
} INFO; 

int DoStuff(const INFO *lpInfo); 

В Паскале вы можете захотеть импортировать его как это:

type 
    TInfo = record 
    foo: Integer; 
    end; 

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

Но поскольку TInfo мал, компилятор может выбрать, чтобы пройти структура по значению. Поэтому вы можете аннотировать с помощью [ref], чтобы заставить компилятор передать параметр в качестве ссылки.

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

Спасибо за это. «Но поскольку TInfo мала, компилятор может выбрать передачу структуры по значению». Вы видели это где-то где-то, или вы заметили это на выходе компиляции? –

+0

Документация довольно неясна. Только 32-битный ABI компилятор Windows удаленно [задокументирован] (http://docwiki.embarcadero.com/RADStudio/en/Program_Control_ (Delphi)) от Emba, а затем не очень хорошо. Покрытие аргументов 'const' является, э-э, ну, неполным. Но да, записи могут быть нажаты по значению или по ссылке, в зависимости от их размера. Для кода в моем ответе без '[ref]', два компилятора Windows пройдут по значению. Добавьте еще один 'int' в структуру и 32-битный компилятор передает по ссылке, но 64-битный компилятор по значению. Добавьте еще один, и оба пройдут по ссылке. –

+0

ha, что почти точно, что я пытался выяснить. Спасибо –