Показать сообщение отдельно

  #34  
Старый 25.04.2010, 21:55
Flame of Soul
Участник форума
Регистрация: 25.05.2007
Сообщений: 290
С нами: 9980798

Репутация: 435
По умолчанию

Цитата:
Сообщение от AlexTheC0d3r  
чем объясняется ввод новой переменной t?
Delphi не производит разворачивания циклов, как и вынесение инвариантного кода за пределы цикла. То есть в компиляторе нет как такового оптимизатора, вот я и посчтитала что более рационально будет именно так, потому что метод:

PHP код:
for i:=0 to memo1.lines.count – 1 do 
будет вызываться в каждой итерации, то есть каждый раз будет подсчитывать количество элементов, а если у нас там элементов несколько тысяч, допустим 2000 строк, собственно не так уж и много, как и посчитать количество их элементов, но так как тип используемый там идет как string а не char и заблогонамеренно неизвестна длина строк, пересчет происходить будет в каждой итерации. Даже если взять что memo1.lines.count было бы постоянным и пересчета не производилось, то в условии у нас стоит математическое выражение memo1.lines.count -1

ну соответственно чтобы не заставлять вести лишние подсчеты и желательно вынести количество элементов в отдельную переменную, если конечно оно у нас постоянно и не меняется в теле цикла на произвольное, допустим код вида:
PHP код:
var i:integer;
begin
  
for i:=0 to Memo1.Lines.Count-1 do
    if (
i mod 2 = 0) then begin memo1.Lines.Add('a') end;
end; 
во первых доказывает нам что VCL вызывает подсчет в каждой итерации, а во вторых указывает на то что количество элементов в теле цикла при его воздействии на Memo меняется и учитывается, что тоже иногда необходимо. (i mod 2 = 0) использовано только чтобы избежать зацикливания.

Ну и банально даже то что при инкрементации переменной цикла i на более высокое значение компилятор не использует Флаг нуля (ZF) а просто сравнивает значение с 0. Семантически это не верно, но я не вижу в этом особого греха.

Последний раз редактировалось Flame of Soul; 25.04.2010 в 22:00..
 
Ответить с цитированием