Форум: "Прочее";
Текущий архив: 2008.06.15;
Скачать: [xml.tar.bz2];
Внизcase n of Найти похожие ветки
← →
tButton © (2008-05-05 01:41) [0]просто любопытно, при компиляции структуры case ... of генерируется набор условных переходов или как-то иначе?
← →
Германн © (2008-05-05 02:02) [1]
> tButton © (05.05.08 01:41)
>
> просто любопытно, при компиляции структуры case ... of
> генерируется набор условных переходов или как-то иначе?
>
Напиши, откомпилируй и посмотри.
← →
tButton © (2008-05-05 02:22) [2]
> Напиши
не проблема
> откомпилируй
не проблема
> посмотри
не проблема
но только я все равно не пойму то, что увижу =)
← →
No_Dead © (2008-05-05 02:40) [3]> все равно не пойму то, что увижу
значит декомпилируй:)
← →
DrPass © (2008-05-05 03:36) [4]
> просто любопытно, при компиляции структуры case ... of
> генерируется набор условных переходов или как-то иначе?
Насколько знаю, по возможности Delphi старается строить таблицу переходов - чтобы сразу по значению было можно определить, куда прыгать без кучи последовательных сравнений
← →
tButton © (2008-05-05 03:37) [5]логично...
← →
Riply © (2008-05-05 06:06) [6]> [4] DrPass © (05.05.08 03:36)
> Насколько знаю, по возможности Delphi старается строить таблицу переходов - чтобы
> сразу по значению было можно определить, куда прыгать без кучи последовательных сравнений
Вроде, где-то читала, что при "сортированных" значениях case работает значительно быстрее.
К сожалению не могу вспомнить где именно читала, а Delphi нет под рукой, чтобы посмотреть.
← →
Восхищенный (2008-05-05 15:56) [7]> Riply © (05.05.08 06:06) [6]
> не могу вспомнить где именно читала
В любой серьезной книжке по Паскалю.
← →
Ketmar © (2008-05-05 16:17) [8]> Вроде, где-то читала, что при «сортированных» значениях
> case работает значительно быстрее.
не факт, что оно само не сортирует. по крайней мере раньше с построением каких-то внутренних таблиц для case был связан чудный баг в компиляторе — опо сжирало всю память, потом весь своп и взрывалось (говорят, после D7 починили). отсюда можно предположить, что и сортировать не проблема — дел-то ветки в AST подвигать.
зыж нет, проверить не могу.
← →
TUser © (2008-05-06 08:41) [9]
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.
← →
tButton © (2008-05-06 11:13) [10]т.е. примерно так?
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
← →
TUser © (2008-05-06 17:47) [11]ага
← →
tButton © (2008-05-07 00:37) [12]и поэтому дельфийский case не работает со строками?
← →
Palladin © (2008-05-07 00:48) [13]не делфийский, а паскалевский как таковой
← →
Anatoly Podgoretsky © (2008-05-07 01:24) [14]> tButton (07.05.2008 00:37:12) [12]
Зато IF работает, а case это частный случай, специализированый. Вместо него бы лучше если был бы switch, а так просто лишняя сущность.
← →
DrPass © (2008-05-07 01:28) [15]
> Вместо него бы лучше если был бы switch, а так просто лишняя
> сущность
switch так красиво не оптимизируется. А кроме того, его функциональность явно избыточна
← →
tButton © (2008-05-07 01:41) [16]> Palladin © (07.05.08 00:48) [13]
тут где-то рядом проскакивала информация что паскалевский он был до 7й версии дельфи. но в принципе да. паскалевский.
> Anatoly Podgoretsky © (07.05.08 01:24) [14]
в принципе можно написать препроцессор, который будет интерпретировать switch в набор if.
немного тезисов:
* значит все-таки switch преобразуется в набор условных переходов?
а case можно рассматривать как частный случай switch.
* а если case"ом проверяются непоследовательные значения?
* будет ли целесообразным применять циклы для перебора условий?
← →
Anatoly Podgoretsky © (2008-05-07 07:48) [17]> DrPass (07.05.2008 01:28:15) [15]
Не тот swich, который в С, а тот swich, который переход по таблице. Для значений от 0 до N - 1
Очень быстрая операция.
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2008.06.15;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.011 c