Текущий архив: 2006.09.10;
Скачать: CL | DM;
ВнизЗачем нужен const? Найти похожие ветки
← →
AlexanderMS © (2006-08-22 17:30) [0]
function AnsiUpperCase(const S: string): string;
Зачем здесь стоитconst
?
В подобных случях я спокойно объявлял процедуры и функции без этого слова и результат не менялся. В TurboPascal вообще не былоconst
в объявлении процедур и функций. А в Delphi ещё и методы класса так же объявляют. И не только, гдеstring
.
Означает, ясное дело, - постоянная величина. Ну а если не указывать?
← →
Zeqfreed © (2006-08-22 17:32) [1]> [0] AlexanderMS © (22.08.06 17:30)
A constant (const) parameter is like a local constant or read-only variable. Constant parameters are similar to value parameters, except that you can"t assign a value to a constant parameter within the body of a procedure or function, nor can you pass one as a var parameter to another routine. (But when you pass an object reference as a constant parameter, you can still modify the object"s properties.)
Using const allows the compiler to optimize code for structured- and string-type parameters. It also provides a safeguard against unintentionally passing a parameter by reference to another routine.
Here, for example, is the header for the CompareStr function in the SysUtils unit:
function CompareStr(const S1, S2: string): Integer;
Because S1 and S2 are not modified in the body of CompareStr, they can be declared as constant parameters.
← →
Ega23 © (2006-08-22 17:33) [2]
A constant (const) parameter is like a local constant or read-only variable. Constant parameters are similar to value parameters, except that you can’t assign a value to a constant parameter within the body of a procedure or function, nor can you pass one as a var parameter to another routine. (But when you pass an object reference as a constant parameter, you can still modify the object’s properties.)
Using const allows the compiler to optimize code for structured- and string-type parameters. It also provides a safeguard against unintentionally passing a parameter by reference to another routine.
Here, for example, is the header for the CompareStr function in the SysUtils unit:
function CompareStr(const S1, S2: string): Integer;
Because S1 and S2 are not modified in the body of CompareStr, they can be declared as constant parameters.
← →
IceBeerg © (2006-08-22 17:43) [3]А так же можно почитать:
http://delphimaster.net/view/2-1155830851/
← →
ArtemESC © (2006-08-22 17:48) [4]AlexanderMS ©
Если стоит const, то эту переменную в процедуре (функции) нельзя изменять - и вообще не знаю как но это вреде болле оптимизированно, хотя
может быть просто для строгости языка...
← →
DprYg © (2006-08-22 17:49) [5]Исключает в большинстве случаев скрытое добавление try...finally, которое требуется для того, чтобы значение счетчика ссылок всегда уменьшалось. Профилировщик показал, что быстродействие увеличивается приблизительно на 10%.
← →
StriderMan © (2006-08-22 17:50) [6]const и var это передача параметра через неявный указатель
← →
TUser © (2006-08-22 17:51) [7]const передаст указатель и не позволит менять занчение величны
← →
Anatoly Podgoretsky © (2006-08-22 18:44) [8]const указатель на саму строку, а var на переменную
Поэтому во втором случае можно изменять эту строку, но двойной указатель и конечно будет сгенерирован дополнительный код по управлению.
← →
guav © (2006-08-23 00:11) [9]> [6] StriderMan © (22.08.06 17:50)
> const и var это передача параметра через неявный указатель
Насчёт const неправда. const передаёт по значению (для переменной типа string указатель на саму строку выполняет роль значения, при var будет указатель на указатель). Записи (за все не уверен, но большие точно) передаются по ссылке, даже если const и var не указан (не при всех calling convention, но при register это так)... В общем, лучше не стоит закладываться на передачу по ссылке или передачу по значению при const, const только не позволит менять значение величны и оптимизирует соответственно код.
← →
Anatoly Podgoretsky © (2006-08-23 00:37) [10]И можно добавить, что без модификаторов, будет передана копия переменной.
← →
guav © (2006-08-23 00:52) [11]> И можно добавить, что без модификаторов, будет передана
> копия переменной.
Для записей размером более 4 байт и для массивов и при отсутствии модификаторов будет передана ссылка. В случае модификации внутри принимающей подпрограмы рабочая копия будет создана в этой подпрограмме.
Это верно для моделей вызова register и pascal.
← →
Loginov Dmitry © (2006-08-23 07:52) [12]> И можно добавить, что без модификаторов, будет передана
> копия переменной.
В случае строк - не будет.
← →
guav © (2006-08-23 12:41) [13]> В случае строк - не будет.
Как раз в случае строк будет. Переменная типа string содержит значение в виде ссылки на структуру содержащую сам текст, и именно это значение передаётся.
Разумеется, речь не идёт о коротких строках.
Точно так же, переменные содержащие классы и экземпляры классов передаются по значению, т.к. для этих переменных значение тоже есть ссылка на соответствующую структуру.
← →
Loginov Dmitry_ (2006-08-23 12:56) [14]Ну зачем же так грузить?
Просто имелось ввиду, то сам текст передаваться не будет.
← →
guav © (2006-08-23 13:05) [15]Ну и поля экземпляра класса ведь тоже не передаются, когда он передаётся по значению.
Ещё можно добавить, что сама передача переменной с const и без модификатора одинакова, различия могут быть только внутри принимающей подпрограммы; это можно показать на примере write-методов св-в, где не важно, указан ли для значения модификатор const или нет.
← →
Zeqfreed © (2006-08-23 13:25) [16]
procedure UseString(S : String);
var
len, ref : Integer;
p : ^Integer;
begin
p := Pointer(S);
Dec(p);
len := p^;
Dec(p);
ref := p^;
ShowMessageFmt("Length: %d; References count: %d", [len, ref]);
raise Exception.Create("");
end;
procedure UseString_Const(const S : String);
var
len, ref : Integer;
p : ^Integer;
begin
p := Pointer(S);
Dec(p);
len := p^;
Dec(p);
ref := p^;
ShowMessageFmt("Length: %d; References count: %d", [len, ref]);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
S : String;
len, ref : Integer;
p : ^Integer;
begin
S := "Blablabla";
UniqueString(S);
try
UseString(S);
except end;
p := Pointer(S);
Dec(p);
len := p^;
Dec(p);
ref := p^;
ShowMessageFmt("Length: %d; References count: %d", [len, ref]);
end;
procedure TForm1.Button2Click(Sender: TObject);
var
S : String;
begin
S := "Blablabla";
UniqueString(S);
UseString_Const(S);
end;
Код, демонстрирующий то, что при передаче параметра без модификатора const компилятором автоматически добавляется блок try-finally для уменьшения счетчика ссылок строки.
Страницы: 1 вся ветка
Текущий архив: 2006.09.10;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.04 c