Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.11.26;
Скачать: CL | DM;

Вниз

Цикл for.   Найти похожие ветки 

 
oooop   (2006-11-08 11:04) [0]

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

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


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

Спасибо!


 
DrPass ©   (2006-11-08 11:07) [1]

Будет запрашиваться при каждой итерации. Компилятор же не знает, возвращает функция каждый раз одно и то же значение, либо ее результат зависит от фазы Луны


 
Сергей М. ©   (2006-11-08 11:07) [2]


> её значение сохраняется в течении всего цикла?


Да.
Вычисляется единожды.


 
Сергей М. ©   (2006-11-08 11:09) [3]


> DrPass ©   (08.11.06 11:07) [1]


Ты не прав.

В соответствии с правилами Паскаля граничные условия for-цикла вычисляются единожды.


 
Desdechado ©   (2006-11-08 11:10) [4]

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


 
ЮЮ ©   (2006-11-08 11:14) [5]


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

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


 
oooop   (2006-11-08 11:15) [6]

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

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


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


 
DrPass ©   (2006-11-08 11:21) [7]

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


 
DrPass ©   (2006-11-08 11:22) [8]


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

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


 
han_malign ©   (2006-11-08 11:23) [9]


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

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


 
DrPass ©   (2006-11-08 11:25) [10]


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

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


 
Desdechado ©   (2006-11-08 11:31) [11]

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


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


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

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


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


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

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


 
Anatoly Podgoretsky ©   (2006-11-08 12:50) [14]

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

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


 
Anatoly Podgoretsky ©   (2006-11-08 12:51) [15]

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

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

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


 
Anatoly Podgoretsky ©   (2006-11-08 12:52) [16]

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

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


 
Anatoly Podgoretsky ©   (2006-11-08 12:52) [17]

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

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


 
Anatoly Podgoretsky ©   (2006-11-08 12:53) [18]

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

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


 
Anatoly Podgoretsky ©   (2006-11-08 12:55) [19]

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

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


 
DrPass ©   (2006-11-08 13:13) [20]


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

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


 
Anatoly Podgoretsky ©   (2006-11-08 14:22) [21]

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

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


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

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


 
Anatoly Podgoretsky ©   (2006-11-09 07:45) [23]

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

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



Страницы: 1 вся ветка

Текущий архив: 2006.11.26;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.046 c
2-1162815868
m-kirill-2003
2006-11-06 15:24
2006.11.26
Знает каждый


8-1144910763
jakata
2006-04-13 10:46
2006.11.26
захват с 4 камер


3-1158849383
evgenij_
2006-09-21 18:36
2006.11.26
Rave Report+Access


2-1162896730
abba
2006-11-07 13:52
2006.11.26
Ошибкка при записи из одного файла в другой, используя тип. файлы


3-1159189214
alsov
2006-09-25 17:00
2006.11.26
Сумма в конце датасета