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

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

Цикл for.


Страницы:   1 2

oooop ©   (2006-11-08 11:04:00) 

Здраствуйте. Предположим, есть такой цикл:

for i := 0 to MyFuncCount(MyData) do
...


Как в таком случае будут вызываться MyFuncCount? При каждой итерации цикла будут снова запрошена функция MyFuncCount или её значение сохраняется в течении всего цикла?

Спасибо!


Anatoly Podgoretsky   (2006-11-09 07:45:00) [1]

> SlymRO  (09.11.2006 4:59:22)  [22]

У меня и так ro, а не rw


SlymRO   (2006-11-09 04:59:00) [2]

Anatoly Podgoretsky ©   (08.11.06 14:22) [21]
Дядя Толя, рекомендую сменить домен на www.delphimaster.ro


Anatoly Podgoretsky   (2006-11-08 14:22:00) [3]

> DrPass  (08.11.2006 13:13:20)  [20]

Бывает, особенно если подобные статьи попадутся. А ведь они такие гадские, намертво в голову внедряется, и если попадется невменяемый программист, то он так и уйдет убежденный в этом, хорошо если еще без ругани, мол ламеры вы все, или с реадонли, в особых случаях.
Тут последнее время много таких встречалось, а прикидывались приличными людьми.


DrPass   (2006-11-08 13:13:00) [4]


> Anatoly Podgoretsky ©   (08.11.06 12:55) [19]

Да я уже разобрался... Бывает...


Anatoly Podgoretsky   (2006-11-08 12:55:00) [5]

> DrPass  (08.11.2006 11:25:10)  [10]

Продолжаешь заблуждаться.
Если происходить проверка диапазона, так это не из-за цикла, конечное и начальное значение цикла вычисляются один раз еще до исполнения цикла.


Anatoly Podgoretsky   (2006-11-08 12:53:00) [6]

> DrPass  (08.11.2006 11:22:08)  [8]

Это путь оптимизации, в данном случае обратный цикл благоприятно сказывается на производительности при удалении элементов из списка.


Anatoly Podgoretsky   (2006-11-08 12:52:00) [7]

> DrPass  (08.11.2006 11:21:07)  [7]

Не надо смотреть код, смотреть надо или стандарт языка или справку.


Anatoly Podgoretsky   (2006-11-08 12:52:00) [8]

> oooop  (08.11.2006 11:15:06)  [6]

Мы эту статью здесь не раз читали и каждый раз смеялись и жалели автора.


Anatoly Podgoretsky   (2006-11-08 12:51:00) [9]

> Desdechado  (08.11.2006 11:10:04)  [4]

> На каждой итерации - в Си.

В СИ цикл WHILE с названием FOR


Anatoly Podgoretsky   (2006-11-08 12:50:00) [10]

> DrPass  (08.11.2006 11:07:01)  [1]

В Паскале цикл FOR а не WHILE
Поэтому цикл будет выполнен один раз


DrPass   (2006-11-08 12:16:00) [11]


> Плохиш ©   (08.11.06 12:02) [12

Ладно, убедил - когда я первый раз экспериментировал, у меня в функцию Length поставлялась константа :)


Плохиш   (2006-11-08 12:02:00) [12]


> DrPass ©   (08.11.06 11:25) [10]
>
> > han_malign ©   (08.11.06 11:23) [9]
>
> Это не ошибка. Сделай такой цикл и посмотри сгенерированный
> код. Так и есть - длина строки проверяется на каждой итерации.

Специально проверил. Врёте, товагищ! По шагам в CPU-окне пройдись и удивись.


Desdechado   (2006-11-08 11:31:00) [13]

> длина строки проверяется на каждой итерации
ну, обращение в к -4 байту в строке - это не вызов функции...


DrPass   (2006-11-08 11:25:00) [14]


> han_malign ©   (08.11.06 11:23) [9]

Это не ошибка. Сделай такой цикл и посмотри сгенерированный код. Так и есть - длина строки проверяется на каждой итерации.


han_malign   (2006-11-08 11:23:00) [15]


> или это ошибка в статье?

- по этой статье уже было бурное обсуждение - это там не единственная, скажем так, неточность(пример выбран неудачно)...


DrPass   (2006-11-08 11:22:00) [16]


> ЮЮ ©   (08.11.06 11:14) [5]

А я всегда делаю for i := List.Count - 1 downto 0, и поэтому такая проблема передо мной даже не стояла :)


DrPass   (2006-11-08 11:21:00) [17]

Вот сейчас посмотрел генерируемый ассемблерный код - действительно, обычные функции вычисляются один раз перед началом цикла. А вот compilermagic-функции типа Length, как ни странно, вычисляются на каждой итерации. Какая-то сермяжная правда в этом есть - они по сути традиционными функциями не являются, а инлайнятся прямо в код. Но архитектура получается уродливой и с "подводными камнями"...


oooop   (2006-11-08 11:15:00) [18]

Сейчас читал "Написание оптимального кода под Delphi", и встретил там такое предложение:

> Выносите инвариантный код за тело цикла. Наиболее частая
> ошибка – for i:=1 to length(str) do... Дело в том, что при
> каждой итерации будет вызываться функция length, что пагубно
> скажется на производительности. Рекомендуется длину строки
> заранее присвоить переменной. Также не включайте в тело
> цикла код, заведомо не зависящий от изменения итерационной
> переменной.


В этом случае, что Length -- исключение из правил? или это ошибка в статье?


ЮЮ   (2006-11-08 11:14:00) [19]


> Будет запрашиваться при каждой итерации.

Основываясь на таком заблуждении и пишут типа
 for i := 0 to List.Count - 1 do begin
   // а внутри цикла беззастенчиво убивают элементы списка и удивляются откуда ошибки
 end;


Desdechado   (2006-11-08 11:10:00) [20]

Один раз - в паскале/дельфи.
На каждой итерации - в Си.
В этом их существенная и неочевидная разница.


Страницы:   1 2

Наверх

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