Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.07.2011, 22:30   #21
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Цитата:
Сообщение от veniside Посмотреть сообщение
> инструкция case полностью идентична ...else if

это в описании языка она идентична, а в скомпилированном виде разница там бывает весьма заметна )
Именно в скомпилированном виде идентична. Дизассемблер подтверждает. Также можете почитать документацию по этому поводу.
Цитата:
Сообщение от veniside Посмотреть сообщение
> и нужна программисту только для удобства при написании кода

а компилятору для удобства оптимизации
Компилятору до лампочки. Это как имена функций или переменных.
eoln вне форума Ответить с цитированием
Старый 04.07.2011, 22:40   #22
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> Дизассемблер подтверждает.

хм, а у меня как раз подтвержадет обратное:

Код:
  if ('A' = A) then
    A := 'B'
  else
    if ('B' = A) then
      A := 'A';
превращается в

Код:
Project2.dpr.68: if ('A' = A) then
0044031A 66833D787F440041 cmp word ptr [$00447f78],$41
00440322 750B             jnz $0044032f
Project2.dpr.69: A := 'B'
00440324 66C705787F440042 mov word ptr [$00447f78],$0042
0044032D EB13             jmp $00440342
Project2.dpr.71: if ('B' = A) then
0044032F 66833D787F440042 cmp word ptr [$00447f78],$42
00440337 7509             jnz $00440342
Project2.dpr.72: A := 'A';
00440339 66C705787F440041 mov word ptr [$00447f78],$0041
а код

Код:
  case (A) of

    'A': A := 'B';
    'B': A := 'A';

  end;
компилируется как:

Код:
Project2.dpr.74: case (A) of
00440342 66A1787F4400     mov ax,[$00447f78]
00440348 6683E841         sub ax,$41
0044034C 7407             jz $00440355
0044034E 66FFC8           dec ax
00440351 740D             jz $00440360
00440353 EB14             jmp $00440369
Project2.dpr.76: 'A': A := 'B';
00440355 66C705787F440042 mov word ptr [$00447f78],$0042
0044035E EB09             jmp $00440369
Project2.dpr.77: 'B': A := 'A';
00440360 66C705787F440041 mov word ptr [$00447f78],$0041
видно, что код для case более разумный.

> почитать документацию по этому поводу

киньте ссылку, почитаю с удовольствием.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 04.07.2011, 22:56   #23
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

как раз таки case Делфи лучше оптимизирует.
хотя про большие кейсы не знаю, если кейс большой и довольно непрерывен, тот тут лучше, ИМХО, это таблица переходов.

для строк довольно удобно применять TStringList.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 05.07.2011, 00:01   #24
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Видимо отладчик отладчику рознь, View CPU у меня тоже самое показывает в режиме отладки. А IDA это:
Принцип (схема реализации) ведь один. А то что мнемоники разные, это уже вопрос реализации.
Про оптимизатор конкретно ничего не скажу - что-то лучше, что-то хуже, дядькам Борланда виднее
Изображения
Тип файла: jpg 111.jpg (42.0 Кб, 158 просмотров)
eoln вне форума Ответить с цитированием
Старый 05.07.2011, 00:46   #25
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> в режиме отладки. А IDA это

в отладчике (ViewCPU) версия без особой оптимизации, а в IDA версия с полной оптимизацией. Код в IDА у вас практически похож потому, что A нигде потом не используется. Вот оптимизатор и выкинул половину else и половину case. Если А используется, разница более заметна:


Код:
  if ('A' = A) then
    A := 'B'
  else
    if ('B' = A) then
      A := 'C'
    else
      if ('C' = A) then
	A := 'A'
      else
	A := 'D';
  //


.itext:0043F319                 cmp     bx, 41h
.itext:0043F31D                 jnz     short loc_43F325
.itext:0043F31F                 mov     bx, 42h
.itext:0043F323                 jmp     short loc_43F341
.itext:0043F325 ; ---------------------------------------------------------------------------
.itext:0043F325
.itext:0043F325 loc_43F325:                             ; CODE XREF: .itext:0043F31Dj
.itext:0043F325                 cmp     bx, 42h
.itext:0043F329                 jnz     short loc_43F331
.itext:0043F32B                 mov     bx, 43h
.itext:0043F32F                 jmp     short loc_43F341
.itext:0043F331 ; ---------------------------------------------------------------------------
.itext:0043F331
.itext:0043F331 loc_43F331:                             ; CODE XREF: .itext:0043F329j
.itext:0043F331                 cmp     bx, 43h
.itext:0043F335                 jnz     short loc_43F33D
.itext:0043F337                 mov     bx, 41h
.itext:0043F33B                 jmp     short loc_43F341
.itext:0043F33D ; ---------------------------------------------------------------------------
.itext:0043F33D
.itext:0043F33D loc_43F33D:                             ; CODE XREF: .itext:0043F335j
.itext:0043F33D                 mov     bx, 44h
.itext:0043F341
Код:
  case (A) of

    'A': A := 'B';
    'B': A := 'C';
    'C': A := 'A';
    else
	 A := 'D';

  end;

.itext:0043F341                 sub     bx, 41h
.itext:0043F345                 jz      short loc_43F353
.itext:0043F347                 dec     bx
.itext:0043F34A                 jz      short loc_43F359
.itext:0043F34C                 dec     bx
.itext:0043F34F                 jz      short loc_43F35F
.itext:0043F351                 jmp     short loc_43F365
.itext:0043F353 ; ---------------------------------------------------------------------------
.itext:0043F353
.itext:0043F353 loc_43F353:                             ; CODE XREF: .itext:0043F345j
.itext:0043F353                 mov     bx, 42h
.itext:0043F357                 jmp     short loc_43F369
.itext:0043F359 ; ---------------------------------------------------------------------------
.itext:0043F359
.itext:0043F359 loc_43F359:                             ; CODE XREF: .itext:0043F34Aj
.itext:0043F359                 mov     bx, 43h
.itext:0043F35D                 jmp     short loc_43F369
.itext:0043F35F ; ---------------------------------------------------------------------------
.itext:0043F35F
.itext:0043F35F loc_43F35F:                             ; CODE XREF: .itext:0043F34Fj
.itext:0043F35F                 mov     bx, 41h
.itext:0043F363                 jmp     short loc_43F369
.itext:0043F365 ; ---------------------------------------------------------------------------
.itext:0043F365
.itext:0043F365 loc_43F365:                             ; CODE XREF: .itext:0043F351j
.itext:0043F365                 mov     bx, 44h
> Принцип (схема реализации) ведь один.

как уже говорили выше, реализовать case можно более оптимально через таблицу переходов (хотя пока компилятор от борланд этого и не делает). Да и без таблицы код большого кейса будет выполнятся быстрее, чем аналогичный набор if ... else, видно по кускам выше.

> это уже вопрос реализации

вот и пришли к тому, что реализация у case и набора if..else различается. Это и понятно, ведь if..else универсальная штука, а case заточен строго на перечислимые типы.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц