![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Какая разница? Const или нет [D4, WinXP]
Iconka © (2004-08-13 11:33:00)Какая разница в объявлении процедуры:
procedure MyProc(const MyParam: string);
и
procedure MyProc(MyParam: string);
На что, в данном случае, влияет const?
Думкин (2004-08-13 12:14:00) [21]> [17] Sandman25 © (13.08.04 12:13)
Так точно. :)
Кстати, книга Бакнелла начинается как раз с этого. :)
Digitman (2004-08-13 12:14:00) [22]
> >ну чушь же !
>
> А если String=ShortString?
да хоть SuperShortString ! при дифолт-соглашении о вызове параметр передается либо через регистр либо через стек ... но факт.значение параметра предст.собой не строку, а адреслибо ее буфера (стат.строки) либо упр.структуры (дин.строки)
Sandman25 (2004-08-13 12:13:00) [23][11] Думкин © (13.08.04 12:02)
Разобрался вроде. Без const происходит увеличение числа ссылок, это оно тормозит работу.
Думкин (2004-08-13 12:10:00) [24]
> [14] Sandman25 © (13.08.04 12:08)
А скакого он одинаковый? У меня разный.
MetalFan (2004-08-13 12:08:00) [25]109 / 672
const / без const
Sandman25 (2004-08-13 12:08:00) [26][11] Думкин © (13.08.04 12:02)
Ничего не понимаю. Код генерится одинаковый, а время выполнения разное, 94 против 500.
FastByte (2004-08-13 12:06:00) [27]const в данном случае означает константный-неизменяемый параметр MyParam.
Внутри процедуры строку нельзя изменять, вернее, не позволено. Очень классная штука, если уметь ей пользоваться :)
Хотя Digitman дал более подробное объяснение :)
KSergey (2004-08-13 12:05:00) [28]Просто замечу, что, если на входе будет не String, а структура, то при var и const передастся ее адрес, а без них - вся через стек.
Думкин (2004-08-13 12:02:00) [29]Покурим такой код:
function ConstString (const s : string) : integer;
begin
Result := length(s)
end;
function NoConstString (s : string) : integer;
begin
Result := length(s)
end;
procedure TForm1.Button2Click(Sender: TObject);
var s : string;
i : integer;
Tick : Cardinal;
begin
Screen.Cursor := crHourGlass;
Tick := GetTickCount;
s := '123';
try
for i := 0 to 10000000 do ConstString(s)
finally
Tick := GetTickCount - Tick;
Button2.Caption := IntToStr(Tick);
Screen.Cursor := crDefault
end
end;
procedure TForm1.Button3Click(Sender: TObject);
var s : string;
i : integer;
Tick : Cardinal;
begin
Screen.Cursor := crHourGlass;
Tick := GetTickCount;
s := '123';
try
for i := 0 to 10000000 do NoConstString(s)
finally
Tick := GetTickCount - Tick;
Button3.Caption := IntToStr(Tick);
Screen.Cursor := crDefault
end
end;
Леван (2004-08-13 11:59:00) [30]TO Iconka:
при procedure MyProc(VAR MyParam: string)
в процедуру передается адрес упр.структуры оригинальной строки
компилятор непресекает попытки изменений MyParam
наоборот, изменения, внес енние процедурой в MyParam,
происходять в оригинальной строке
я так думаю
Леван
Digitman (2004-08-13 11:59:00) [31]
> Рамиль © (13.08.04 11:54) [7]
да , именно так ... мне это следовало бы явно заметить ... т.е. если попытки модификации нет, то оба вызова эквивалентны с т.з. логики и генерируемого компилятором кода
Sandman25 (2004-08-13 11:58:00) [32]Using const allows the compiler to optimize code for structured- and string-type parameters.
Help меня обманул :(
Код в обоих случаях будет одинаковым, никакого прироста производительности.
Рамиль (2004-08-13 11:54:00) [33]
> [3] Digitman © (13.08.04 11:48)
А разве копия строки делается не в момент попытки модификации? Или в процедуре по другому?
Sandman25 (2004-08-13 11:53:00) [34][3] Digitman © (13.08.04 11:48)
Посмотрел CPU. Признаю, был неправ.
Iconka (2004-08-13 11:52:00) [35]
> 2.
> procedure MyProc(MyParam: string);
>
> в процедуру передается адрес упр.структуры временной копии
> оригинальной строки
А как же быть сprocedure MyProc( VARMyParam: string);
Ведь в данном случае тоже передается адрес копии переменной. Какая разница?
Sandman25 (2004-08-13 11:50:00) [36]>ну чушь же !
А если String=ShortString?
Digitman (2004-08-13 11:48:00) [37]
> Sandman25 © (13.08.04 11:38) [2]
> либо ВСЯ СТРОКА записывается в стек).
ну чушь же !
> Iconka © (13.08.04 11:33)
1.
procedure MyProc(const MyParam: string);
в процедуру передается адрес упр.структуры оригинальнойстроки
компилятор пресекает попытки изменений MyParam
2.
procedure MyProc(MyParam: string);
в процедуру передается адрес упр.структуры временной копииоригинальной строки
компилятор не запрещает обращаться к MyParam с целью модификации
все изменения, выполненные телом процедуры в отношении MyParam, никак не влияют на оригинал, с которого была сделана копия
время жизни копии = времени исполнения процедуры , т.е. параметр по сути является лок.переменной процедуры
в случае если в кач-ве параметра передается интерфейс-наследник IUnknown, компилятор так же действует по-разному : если интерфейс передается константой, компилятор не вставляет неявный код вызова _AddRef/_Release, в противном случае компилятор формирует неявный код вызова этих методов
Sandman25 (2004-08-13 11:38:00) [38][1] Ega23 © (13.08.04 11:34)
Нет.
В данном случае const очень сильно влияет на производительность (либо передается адрес в регистре, либо ВСЯ СТРОКА записывается в стек).
В общем случае const влияет на попытку присвоить значение параметру :)
Ega23 (2004-08-13 11:34:00) [39]ИМХО, const можно пропускать. Это по умолчанию. Но можно и писать.