Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2003.02.06;
Скачать: [xml.tar.bz2];

Вниз

Давно хотел спросить , но стеснялся   Найти похожие ветки 

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.013 c
3-15458
AndreyRr
2003-01-20 13:01
2003.02.06
Excel


1-15621
Юра
2003-01-29 11:03
2003.02.06
Быстрый поиск числа в списке


1-15541
i80486
2003-01-27 21:49
2003.02.06
***ВОПРОС ПО ListView***


1-15591
_saha_
2003-01-28 21:59
2003.02.06
Есть вопросик


6-15804
Deep
2002-12-12 01:29
2003.02.06
работа с сокетами





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский