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?


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.


Страницы:   1 2

Наверх

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