Текущий архив: 2003.02.06;
Скачать: CL | DM;
ВнизДавно хотел спросить , но стеснялся Найти похожие ветки
← →
KGB (2003-01-17 18:51) [0]Как правильно делать:
for i:=1 to AnyFunc() do begin...
или
N:=AnyFunc();
for i:=1 to N do begin...
т.е. будет ли компилятор оптимизировать код, что бы в цикле каждый раз не вызывать Anyfunc()
← →
Mischka (2003-01-17 18:53) [1]по-моему, по фигу это. Вроде должен оптимизировать.
← →
gsu (2003-01-17 19:04) [2]В паскале можно
← →
KGB (2003-01-17 19:10) [3]
> gsu ©
Что можно?
← →
gsu (2003-01-17 19:12) [4]AnyFunc(...): integer
даст число, которое и пойдет в for, дале AnyFunc вызываться не будет, хотя в с вроде наоборот, не помню
← →
gsu (2003-01-17 19:15) [5]можешь даже AnyFunc(...) в цикле вызывать все равно цикл будет выполняться от и до констант
← →
Юрий Зотов (2003-01-17 19:41) [6]Если i - локальная переменная, то компилятор Delphi вызовет функцию один раз и построит цикл через регистр CPU.
← →
gsu (2003-01-17 19:48) [7]даже если i глобальная, даже если ее переопределить в AnyFunc(...), то все равно будет тоже самый резалт
← →
gsu (2003-01-18 14:08) [8]Уважаемый, Юрий Зотов ©, разве я не прав ?
← →
Юрий Зотов (2003-01-18 14:15) [9]Если i - глобальная, то компилятор, во-первых, предупредит. И, во-вторых, скорее всего, в этом случае он построит цикл по переменной в памяти, а не через регистр ("скорее всего" - это потому, что я не проверял, а просто исхожу из логики).
Переопределить i в AnyFunc не удастся. Это будет уже другая i - внутренняя для AnyFunc.
← →
gsu (2003-01-18 14:28) [10]>> Если i - глобальная, то компилятор, во-первых, предупредит.
>> Переопределить i в AnyFunc не удастся. Это будет уже другая i - внутренняя для >> AnyFunc.
Может, но результат не изменится
>> И, во-вторых, скорее всего, в этом случае он построит цикл по переменной в
>>памяти, а не через регистр
Насколько я понимаю, компилятор D увидя конструкцию for ... сначала расчитает значения от и до, поместит их куда то, считая константами, а потом начнет цикл по константам !!!
Однако, (вроде на falgol"е) может быть и не так, особенно, если AnyFunc - рекурсивна или зависима
← →
Wolf (2003-01-18 15:11) [11]Поставь брекпоинт в тело функции, и увидишь сколько раз она выполняется. По идее должна 1 раз (не проверял)
← →
Ketmar (2003-01-18 15:15) [12]>gsu © (18.01.03 14:28)
одна из причин, по которым Вирт прибил фор в Обероне-1. и, увы, вернул "взад" в Обероне-2 (зачем?).
Satanas Nobiscum! 18-Jan-XXXVIII A.S.
← →
Anatoly Podgoretsky (2003-01-18 15:39) [13]Если говорить о компиляторах вообще, то второй вариант выполнится фиксированное количество раз, чего не скажешь про первый. И уж дела программиста закладываться ли на внутреенние особенности компилятора или нет.
Могу привести наглядный пример где люди закладывались и потом горели, речь идет о Д1 и выше
For I := 1 to 10 do something;
n := I
Тоже может касаться и вопроса.
← →
gsu (2003-01-18 15:47) [14]>> чего не скажешь про первый
но в D ведь оба варианта почти аналогичны и приводят к одинаковому результату ?
А такую конструкцию я вообще не использую:
For I := 1 to 10 do something;
n := I;
Это ж, надо
← →
Ketmar (2003-01-18 15:50) [15]>gsu © (18.01.03 15:47)
потому что начиная с Д2 компилер гурается. а Д1 был еще на базе BP7, и спокойно "съедал" такую штуку.
Satanas Nobiscum! 18-Jan-XXXVIII A.S.
← →
gsu (2003-01-18 15:58) [16]переходим на D1 (-:|~
← →
Anatoly Podgoretsky (2003-01-18 16:06) [17]Ketmar © (18.01.03 15:50)
Не поэтому и не ругается, а потому что по внутреннему устройству получались разные вариаенты, хотя в любой книге написано, не пытаться исспользовать переменную цикла за ее пределами, а сколько программа нарушает это простое требование жуть и что интересно, что их авторы с пеной у рта отстаивают свою "правоту".
← →
Ketmar (2003-01-18 16:18) [18]>Anatoly Podgoretsky © (18.01.03 16:06)
ну насколько я помню (лень ставить Д1), Д1 все же построен на 16-бит компилере a-la BP. где понятие оптимизации отсутствовало как факт. потому значение переменной после цикла можно было предсказать.
Д2+ построены на оптимайзере от BCC (хоть и кастрированном), потому в них предсказать уже нельзя. точнее, можно, но сложно %-).
а стандарт Паскаля (виртовский), по-моему, вообще скромно умалчивает о таких действиях.
Satanas Nobiscum! 18-Jan-XXXVIII A.S.
Страницы: 1 вся ветка
Текущий архив: 2003.02.06;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.017 c