i:=0 to SomeClass.Size-1 do;
Size имеет тип данных SizeUInt, при вклченной Overflow проверке порой тут ругается на переполнение, ну если Size вернул 0
Переделываю к примеру на такое:
var
i: SizeUInt;
begin
if SomeClass.Size>0 then
for i:=SomeClass.Size-1 downto 0 do; // порядок перебора тут не важен поэтому поменял на более оптимальный цикл
Поменял тип переменной под тип возвращаемого значения и предварительная проверка на >0
(хотя оно и ранее работало правильно, асм не смотрел, там наверное как-то так получается, что само собой цикл не начинает бегать от 0 до High())
Как лучше тут поступать, чтобы Overflow проверка не ругалась? Если оставить как было - какие могут возникнуть проблемы? До этого все работало без проблем
считать от .Size до 1
Ах, да, забыл, там индекс от 0 нужен
ну, я в том плане, что индексируем по [i-1]
Здесь как бы преследуется две цели - чтобы было оптимальнее с т.з. тактов + чтобы Overflow не ругался
хм... надо посмотреть во что это в асм выльется... а если на другой архитектуре, не х86/64, то может будет лишняя операция вычитания каждый раз...
можно заменить на while
и два счётчика? кажется один раз проверить перед входом в цикл - быстрее чем лишний инкремент в цикле
i:=SomeClass.Size; while i > 0 do begin Dec(i); ... тут индексируем по [i] end;
i:=SomeClass.Size; for i:=0 to i-1 do ...;
там вниз нужно было считать
i:=SomeClass.Size; for i:=i-1 downto 0 do ... ; Что-то поменялось? ;-)
Обсуждают сегодня