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

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

Какая разница? Const или нет [D4, WinXP]


Страницы:   1 2

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 можно пропускать. Это по умолчанию. Но можно и писать.


Страницы:   1 2

Наверх

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