![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Цикл for.
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]Один раз - в паскале/дельфи.
На каждой итерации - в Си.
В этом их существенная и неочевидная разница.