![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Какая разница? Const или нет [D4, WinXP]
Iconka © (2004-08-13 11:33:00)Какая разница в объявлении процедуры:
procedure MyProc(const MyParam: string);
и
procedure MyProc(MyParam: string);
На что, в данном случае, влияет const?
Sandman25 (2004-08-13 15:38:00) [1][38] Digitman © (13.08.04 15:34)
Понятно.
Спасибо, мне кода и вдругих версиях хватает :)
Digitman (2004-08-13 15:34:00) [2]
> Sandman25 © (13.08.04 15:21) [35]
> В 3 не нашел, где CPU смотреть
я уже не помню... там, кажется, какая-то заморочка была с этим окном ... типа необходимо было в реестре "ручками" что-то подправить ...
Digitman (2004-08-13 15:32:00) [3]
> GuAV © (13.08.04 15:28) [36]
от уж точно)
какой там нафих Int64, если адресация в Вин32 - 4-хбайтная ?
> при var - по ссылке на эти 4 байта
читай - те же 4 байта в Вин32
после чего в теле делается
mov РОН, [РОН] (если через регистр)
GuAV (2004-08-13 15:28:00) [4]GuAV © (13.08.04 15:18) [34]
Извините, бред написал...
Sandman25 (2004-08-13 15:21:00) [5][32] Digitman © (13.08.04 15:14)
Я в 4 и 6 проверял, точно так же. В 3 не нашел, где CPU смотреть :)
GuAV (2004-08-13 15:18:00) [6]
> Да. Если входная строка не менятеся в процедуре - то const.
> Для строк. Для integer, например, const не приводит к экономии
> :))
Моё имхо.
строка - это 4 байта. При сonst передаётся по значению этих четырёх байт, при var - по ссылке на эти 4 байта. Без const/var -тоже позначению. Const только запрещает её модифицировать.
Integer - это 4 байта. Всё аналогично.
Int64 - это 8 байт. Но при const в стек может толкаться значение, если это - единственный параметр (точнее, в EAX:EDX при register).
Вот для записей и ShortString действительно делается копия.
Digitman (2004-08-13 15:17:00) [7]со строками - одно дело, а вот с интерфейсами, переданными в кач-ве параметров, ситуация посложней ... здесь нужно отчетливо представлять себе механику подсчета ссылок, код которого компилятор генерит по разному в том или ином случае
Digitman (2004-08-13 15:14:00) [8]
> Sandman25 © (13.08.04 15:12) [31]
то-то и оно ... и я вот поленился) ... а на самом деле все четко и понятно ... по кр.мере - в Д5.5
Sandman25 (2004-08-13 15:12:00) [9][30] Digitman © (13.08.04 15:01)
Точно. Я тоже сначала на процедуру не посмотрел, поэтому написал [14]
Digitman (2004-08-13 15:01:00) [10]
> Думкин © (13.08.04 14:06) [27]
> Думкин © (13.08.04 14:08) [28]
да ... не индифферентно ... согласен ...
в случае с
procedure NoConstString (s : string);
begin
end;
у меня в Д5 компилятор (со вкл. опцией оптимизации) вставляет совершенно бестолковый (в прикл.смысле) код, который манипулирует стеком (в первом приближении - понятно почему) и лезет в TLS, кажется, с попыткой предупредить потенц.исключение, которого и в помине нет в этом случае
т.е. получается, что индифферентно с т.з. генерируемого кода вызова, но отнюдь не монопенисуально с т.з. генерируемого кода тела вызываемой процедуры
Anatoly Podgoretsky (2004-08-13 14:08:00) [11]Romkin © (13.08.04 13:19) [24]
А var к излишним затратам.
Думкин (2004-08-13 14:08:00) [12]Причем можно и так:
procedure ConstString (const s : string);
begin
end;
procedure NoConstString (s : string);
begin
end;
Думкин (2004-08-13 14:06:00) [13]> [26] Digitman © (13.08.04 14:04)
Упорный ты. Если индиферентно, то как тогда это:
> [11] Думкин © (13.08.04 12:02)
> Покурим такой код:
> [14] Sandman25 © (13.08.04 12:08)
> разное, 94 против 500.
> [15] MetalFan © (13.08.04 12:08)
> 109 / 672
> const / без const
Digitman (2004-08-13 14:04:00) [14]
> Iconka © (13.08.04 13:06) [23]
> Получается что всегда нужно пользоваться const. Или var
> - если нужно изменять параметр.
необязательно.
если в теле процедуры параметр не предполагается модифицировать, то const или не const - абсолютно индифферентно
а вот если предполагается (и именно - оригинал), то здесь нужен var
VMcL (2004-08-13 13:19:00) [15]>> Iconka © (13.08.04 13:06) [23]
> Получается что всегда нужно пользоваться const.
Не всегда, но по возможности стОит пользоваться.
Romkin (2004-08-13 13:19:00) [16]Да. Если входная строка не менятеся в процедуре - то const.
Для строк. Для integer, например, const не приводит к экономии :))
Iconka (2004-08-13 13:06:00) [17]Получается что всегда нужно пользоваться const. Или var- если нужно изменять параметр.
REA (2004-08-13 12:21:00) [18]Увеличивается число ссылок. Вероятно, при попытке модификации будет сделана копия.
Digitman (2004-08-13 12:17:00) [19]
> либо через регистр либо через стек
уточнение - компилятор принимает решение о передаче параметра тем или иным макаром исходя из позиции параметра в списке параметров
Sandman25 (2004-08-13 12:16:00) [20][18] Digitman © (13.08.04 12:14)
Понятно. Я почему-то думал, что там compiler magic.