14.4.4 Параметры-константы

Вверх  Предыдущий  Следующий

В дополнение к параметрам-переменным и параметрам-значениям Free Pascal также поддерживает и параметры-константы (const). Параметр-константа может быть определен следующим образом:


Параметры const

1407


Определение параметра как константы дает компилятору указание, что параметр не будет изменен вызывающей подпрограммой. Что позволяет компилятору выполнять оптимизацию, которую он не мог бы иначе выполнить, а также он выполняет определёные проверки кода внутри подпрограммы, например: он запрещает присвоения параметру. Например параметр-константа не может быть передан другой функции, которая требует параметра-переменной: компилятор тоже может это проверить. Основное применение для параметра-константы это уменьшение размера стека, а значит повышения производительности, что сохраняет семантику передачи параметра по значению...

Примечание:

В отличие от Delphi, никаких предположений делать нельзя о том, как const-параметры передаются в вызывающий блок. В частности, предположение о том, что параметры большого размера передаются по ссылке, не правильно. Нужно использовать параметр типа constref (ссылка на константу), доступный начиная с версии компилятора 2.5.1.

Исключением является соглашение о вызовах stdcall: применяемый для совместимости со стандартами COM, где большие параметры-константы передаются по ссылке.

Примечание:

Учтите, что определение const представляет собой договор между программистом и компилятором. Программист, сообщает компилятору, что содержимое параметра-константы не будет изменено, при выполнении процедуры, а не компилятор, говорит программисту, что параметр не будет изменен.

Это очень важно и видно при использовании типов со счётчиком ссылок (refcounted). Для этих типов, увеличение или уменьшение счетчика ссылок (неявное) не делается при использовании const. Это часто позволяет компилятору опустить неявные try/finally блоки для этих подпрограмм.

В качестве примера такого побочного эффекта, приведён следующий код, результатом которого будет неожиданный результат:

Var

S : String = 'Какая то информачия';

 

Procedure DoIt(Const T : String);

begin

S:='Ещё какая-то информация';

Writeln(T);

end;

 

begin

DoIt(S);

end.

Он выведет

Ещё какая-то информация

Такое поведение является особенностью конструкции.

Параметры-константы могут быть и нетипизированными (untyped).

Для получения дополнительной информации о нетипизированных параметрахсмотрите раздел 14.4.2 Параметры-переменные

Что касается значений параметра, параметры-константы могут получить значение по умолчанию (default).

Открытые массивы тоже могут быть переданы в качестве параметров-констант. Для получения дополнительной информации об использовании открытых массивов смотрите раздел 14.4.5 Параметр- открытый массив.