Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.046 c
15-1155618462
Ega23
2006-08-15 09:07
2006.09.10
С Днём рождения! 15 августа


1-1153979909
Calibr
2006-07-27 09:58
2006.09.10
Как определить запускающую программу по расширению


3-1151744812
Lis'S
2006-07-01 13:06
2006.09.10
Пробелы в таблицах БД


6-1145611104
alex_s
2006-04-21 13:18
2006.09.10
активность сетевого соединения


11-1132397786
Separator
2005-11-19 13:56
2006.09.10
Версии





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский