Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.51 MB
Время: 0.013 c
1-15598
SergeN
2003-01-29 10:05
2003.02.06
Сомпоненты


3-15407
Melamed
2003-01-21 20:20
2003.02.06
Как отследить изменение значения в LookUp-поле?


1-15561
karl21
2003-01-27 19:49
2003.02.06
А кто видел новую версию Pervasive.V8??


1-15548
arsen
2003-01-28 14:39
2003.02.06
Печать DBGrid


6-15814
Troll
2002-12-09 19:30
2003.02.06
можно ли проверить....