Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.188.252.23] |
|
Сообщ.
#1
,
|
|
|
описание констант в заголовках процедур и функций!!! пожалуйста расскажите поподробнее об этом. назначение и использование! заранее благодарен!
|
Сообщ.
#2
,
|
|
|
Это целесообразно при использовании таких параметров, как String и пользовательских, которые занимают более 4 байт. Но изменять при этом внутри процедуры их нельзя (если не использовать ассемблер . При использовании обычных параметров, значение копируется в стек, и процедуре передаётся адрес переменной в стеке (или само значение, если это Byte/Word/Longint и т.п). Если параметр объявлен как константа, паредаётся адрес переменной (точно так же, как и при использовании конструкции var), но изменять его нельзя (этим const отличается от var). А зачем это надо? Экономия стека - раз, немного меньший размер проги - два. Но это, ещё раз повторюсь, бессмысленно делать при использовании типов Byte/Shortint/Word/Integer/Longint/Real(тоже по-моему).
------------------------------------------------------------------- Короче, более простыми словами: Procedure Me(S: String); {1} Procedure Me(var S: String); {2} Procedure Me(const S: String); {3} В первом случае переменную S внутри процедуры можно изменять как захочется, но переменная, которая была передана в качетсве параметра не изменится (т.е. при вызове Me(A) переменная A не изменится после выполнения процедуры). При запуске процедура потребует 256 с лишним байт стека (на время выполнения). Во втором случае переменную S тоже можно менять, но при этом измениться и та переменная, которая была задана в качетсве параметра (т.е. при запуске Me(A) переменная A может быть изменена после вызова процедуры, поэтому вызов типа Me('String') недопустим, т.к. 'String' - не переменная). Что касается стека, то тут требуется всего лишь 4 байта. В третьем случае переменную S внутри процедуры менять нельзя (её можно только юзать). Хотя в этом случае можно написать Me('String'), т.к. не важно 'String' - это переменная или нет, всё равно менять её никто не будет (это ещё одно отличие от var). Стека требуется 4 байта. Короче, мораль сей басни такова: если используешь параметры большого размера (строка, например) и менять внутри процедуры ты их не собираешься, лучше использовать const (чем без const . |