Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Зачем нужен const?


AlexanderMS ©   (2006-08-22 17:30:00) 

function AnsiUpperCase( const S: string): string;
Зачем здесь стоит const?
В подобных случях я спокойно объявлял процедуры и функции без этого слова и результат не менялся. В TurboPascal вообще не было constв объявлении процедур и функций. А в Delphi ещё и методы класса так же объявляют. И не только, где string.
Означает, ясное дело, - постоянная величина. Ну а если не указывать?


Zeqfreed   (2006-08-23 13:25:00) [1]

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 для уменьшения счетчика ссылок строки.


guav   (2006-08-23 13:05:00) [2]

Ну и поля экземпляра класса ведь тоже не передаются, когда он передаётся по значению.

Ещё можно добавить, что сама передача переменной с const и без модификатора одинакова, различия могут быть только внутри принимающей подпрограммы; это можно показать на примере write-методов св-в, где не важно, указан ли для значения модификатор const или нет.


Loginov Dmitry_   (2006-08-23 12:56:00) [3]

Ну зачем же так гру зить?
Просто имелось ввиду, то сам текст передаваться не будет.


guav   (2006-08-23 12:41:00) [4]

> В случае строк - не будет.

Как раз в случае строк будет. Переменная типа string содержит значение в виде ссылки на структуру содержащую сам текст, и именно это значение передаётся.
Разумеется, речь не идёт о коротких строках.
Точно так же, переменные содержащие классы и экземпляры классов передаются по значению, т.к. для этих переменных значение тоже есть ссылка на соответствующую структуру.


Loginov Dmitry   (2006-08-23 07:52:00) [5]

> И можно добавить, что без модификаторов, будет передана
> копия переменной.


В случае строк - не будет.


guav   (2006-08-23 00:52:00) [6]

> И можно добавить, что без модификаторов, будет передана
> копия переменной.

Для записей размером более 4 байт и для массивов и при отсутствии модификаторов будет передана ссылка. В случае модификации внутри принимающей подпрограмы рабочая копия будет создана в этой подпрограмме.
Это верно для моделей вызова register и pascal.


Anatoly Podgoretsky   (2006-08-23 00:37:00) [7]

И можно добавить, что без модификаторов, будет передана копия переменной.


guav   (2006-08-23 00:11:00) [8]

> [6] StriderMan ©   (22.08.06 17:50)
> const и var это передача параметра через неявный указатель

Насчёт const неправда. const передаёт по значению (для  переменной типа string указатель на саму строку выполняет роль значения, при var будет указатель на указатель). Записи (за все не уверен, но большие точно) передаются по ссылке, даже если const и var не указан (не при всех calling convention, но при register это так)... В общем, лучше не стоит закладываться на передачу по ссылке или передачу по значению при const, const  только не позволит менять значение величны и оптимизирует соответственно код.


Anatoly Podgoretsky   (2006-08-22 18:44:00) [9]

const указатель на саму строку, а var на переменную
Поэтому во втором случае можно изменять эту строку, но двойной указатель и конечно будет сгенерирован дополнительный код по управлению.


TUser   (2006-08-22 17:51:00) [10]

const передаст указатель и не позволит менять занчение величны


StriderMan   (2006-08-22 17:50:00) [11]

constи varэто передача параметра через неявный указатель


DprYg   (2006-08-22 17:49:00) [12]

Исключает в большинстве случаев скрытое добавление try...finally, которое требуется для того, чтобы значение счетчика ссылок всегда уменьшалось. Профилировщик показал, что быстродействие увеличивается приблизительно на 10%.


ArtemESC   (2006-08-22 17:48:00) [13]

AlexanderMS ©  
Если стоит const, то эту переменную в процедуре (функции) нельзя изменять - и вообще не знаю как но это вреде болле оптимизированно, хотя
может быть просто для строгости языка...


IceBeerg   (2006-08-22 17:43:00) [14]

А так же можно почитать:
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1155830851&n=18


Ega23   (2006-08-22 17:33:00) [15]

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.


Zeqfreed   (2006-08-22 17:32:00) [16]

> [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.


Наверх

Титульная страница Поиск, карта сайта Написать письмо