• tButton © (05.05.08 01:41) [0]
    просто любопытно, при компиляции  структуры case ... of генерируется набор условных переходов или как-то иначе?
  • Германн © (05.05.08 02:02) [1]

    > tButton ©   (05.05.08 01:41)
    >
    > просто любопытно, при компиляции  структуры case ... of
    > генерируется набор условных переходов или как-то иначе?
    >

    Напиши, откомпилируй и посмотри.
  • tButton © (05.05.08 02:22) [2]

    > Напиши

    не проблема
    > откомпилируй

    не проблема
    > посмотри

    не проблема

    но только я все равно не пойму то, что увижу =)
  • No_Dead © (05.05.08 02:40) [3]
    > все равно не пойму то, что увижу

    значит декомпилируй:)
  • DrPass © (05.05.08 03:36) [4]

    > просто любопытно, при компиляции  структуры case ... of
    > генерируется набор условных переходов или как-то иначе?

    Насколько знаю, по возможности Delphi старается строить таблицу переходов - чтобы сразу по значению было можно определить, куда прыгать без кучи последовательных сравнений
  • tButton © (05.05.08 03:37) [5]
    логично...
  • Riply © (05.05.08 06:06) [6]
    >  [4] DrPass ©   (05.05.08 03:36)
    > Насколько знаю, по возможности Delphi старается строить таблицу переходов - чтобы
    > сразу по значению было можно определить, куда прыгать без кучи последовательных сравнений

    Вроде, где-то читала, что при "сортированных" значениях case работает значительно быстрее.
    К сожалению не могу вспомнить где именно читала, а Delphi нет под рукой, чтобы посмотреть.
  • Восхищенный (05.05.08 15:56) [7]
    > Riply ©   (05.05.08 06:06) [6]

    > не могу вспомнить где именно читала

    В любой серьезной книжке по Паскалю.
  • Ketmar © (05.05.08 16:17) [8]
    > Вроде, где-то читала, что при «сортированных» значениях
    > case работает значительно быстрее.

    не факт, что оно само не сортирует. по крайней мере раньше с построением каких-то внутренних таблиц для case был связан чудный баг в компиляторе — опо сжирало всю память, потом весь своп и взрывалось (говорят, после D7 починили). отсюда можно предположить, что и сортировать не проблема — дел-то ветки в AST подвигать.

    зыж нет, проверить не могу.
  • TUser © (06.05.08 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 © (06.05.08 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 © (06.05.08 17:47) [11]
    ага
  • tButton © (07.05.08 00:37) [12]
    и поэтому дельфийский case не работает со строками?
  • Palladin © (07.05.08 00:48) [13]
    не делфийский, а паскалевский как таковой
  • Anatoly Podgoretsky © (07.05.08 01:24) [14]
    > tButton  (07.05.2008 00:37:12)  [12]

    Зато IF работает, а case это частный случай, специализированый. Вместо него бы лучше если был бы switch, а так просто лишняя сущность.
  • DrPass © (07.05.08 01:28) [15]

    > Вместо него бы лучше если был бы switch, а так просто лишняя
    > сущность

    switch так красиво не оптимизируется. А кроме того, его функциональность явно избыточна
  • tButton © (07.05.08 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'ом проверяются непоследовательные значения?

    * будет ли целесообразным применять циклы для перебора условий?
Есть новые Нет новых   [134435   +38][b:0][p:0.001]