Форум: "Начинающим";
Текущий архив: 2006.11.26;
Скачать: [xml.tar.bz2];
ВнизЦикл 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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.042 c