-
просто любопытно, при компиляции структуры case ... of генерируется набор условных переходов или как-то иначе?
-
> tButton © (05.05.08 01:41) > > просто любопытно, при компиляции структуры case ... of > генерируется набор условных переходов или как-то иначе? >
Напиши, откомпилируй и посмотри.
-
> Напиши
не проблема > откомпилируй
не проблема > посмотри
не проблема
но только я все равно не пойму то, что увижу =)
-
> все равно не пойму то, что увижу
значит декомпилируй:)
-
> просто любопытно, при компиляции структуры case ... of > генерируется набор условных переходов или как-то иначе?
Насколько знаю, по возможности Delphi старается строить таблицу переходов - чтобы сразу по значению было можно определить, куда прыгать без кучи последовательных сравнений
-
логично...
-
> [4] DrPass © (05.05.08 03:36) > Насколько знаю, по возможности Delphi старается строить таблицу переходов - чтобы > сразу по значению было можно определить, куда прыгать без кучи последовательных сравнений
Вроде, где-то читала, что при "сортированных" значениях case работает значительно быстрее. К сожалению не могу вспомнить где именно читала, а Delphi нет под рукой, чтобы посмотреть.
-
> Riply © (05.05.08 06:06) [6]
> не могу вспомнить где именно читала
В любой серьезной книжке по Паскалю.
-
> Вроде, где-то читала, что при «сортированных» значениях > case работает значительно быстрее. не факт, что оно само не сортирует. по крайней мере раньше с построением каких-то внутренних таблиц для case был связан чудный баг в компиляторе — опо сжирало всю память, потом весь своп и взрывалось (говорят, после D7 починили). отсюда можно предположить, что и сортировать не проблема — дел-то ветки в AST подвигать.
зыж нет, проверить не могу.
-
procedure TForm1.FormCreate(Sender: TObject);
var i: integer;
begin
i := StrToInt (Edit1.Text);
case i of
1: showmessage('1');
2: showmessage('2');
3: showmessage('3');
4: showmessage('4');
5: showmessage('5');
6: showmessage('6');
7: showmessage('7');
8: showmessage('8');
9: showmessage('9');
end;
end;
Оптимизирует он, однако. Этот код скомпилился так - сначала проверяется, что меньше 10, потом в зависимости от i вычисляется адрес, куда прыгать. Delphi7.
-
т.е. примерно так? 10 if i>9 goto 130 11 if i<1 goto 130 20 x = i * 10 + 30 30 goto x 40 showmessage('1'); 50 showmessage('1'); 60 showmessage('1'); ... 130 end
-
ага
-
и поэтому дельфийский case не работает со строками?
-
не делфийский, а паскалевский как таковой
-
> tButton (07.05.2008 00:37:12) [12]
Зато IF работает, а case это частный случай, специализированый. Вместо него бы лучше если был бы switch, а так просто лишняя сущность.
-
> Вместо него бы лучше если был бы switch, а так просто лишняя > сущность
switch так красиво не оптимизируется. А кроме того, его функциональность явно избыточна
-
> Palladin © (07.05.08 00:48) [13] тут где-то рядом проскакивала информация что паскалевский он был до 7й версии дельфи. но в принципе да. паскалевский.
> Anatoly Podgoretsky © (07.05.08 01:24) [14] в принципе можно написать препроцессор, который будет интерпретировать switch в набор if.
немного тезисов: * значит все-таки switch преобразуется в набор условных переходов? а case можно рассматривать как частный случай switch.
* а если case'ом проверяются непоследовательные значения?
* будет ли целесообразным применять циклы для перебора условий?
|