· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.A&O —› Brain vs C compiler

<< . 1 . 2 . 3 . 4 . 5 . 6 . 7 . 8 . 9 .

Посл.отвђт Сообщенiе


Дата: Сен 8, 2003 17:57:01

Switch - вот самый варварский оператор!
#include "stdio.h"
int main(int n,char* p[])
{
  int i,j;
  switch(n)
  {
    case 1:
      for(i=0;i<4;i++)
      {
    case 2:
	for (j=0;j<3;j++)
	{
    default:
	  printf("Hello\n");
	}
      }
  }
}


Дата: Сен 8, 2003 18:13:52

Здесь все зависит от того, в какой последовательности расположены значения case. В данном случае я бы примерно так написал.
mov eax, n
dec eax
jz case_1
dec eax
jz case_2
;default code here


Дата: Сен 11, 2003 20:23:20

Black_mirror

Чего на switch/case гнать? Хорошо оптимизирующий компилятор его в очень эффективный код превратит. А если его так мешать - ну что ж, сам виноват. Алгоритм переформулировать надо :)


Дата: Сен 12, 2003 07:46:45

Fixer
А ты проверял? ;)
Да (с точностью до мкс). Твой вариант выполняется с той же скоростью, что и два моих, а мой третий (кажется, первый по порядку) выполняется на 12 мкс быстрее.

Приведи хоть один в подтверждении своей мысли.
Приведу даже не алгортм, а шаблон:
for (DWORD a=0;a<Count;a++) {
 ... //несколько операторов
 if (SomeCondition()) {
  ... //несколько операторов
  break;
 }
 ... //несколько операторов
}

Если этого мало, могу привести реальную функцию, которую я не представляю без break.

Я коммерческий программист и это мой хлеб. Я пишу много и часто в том числе и большие программные проекты (как правило их и пишу).
Под "сложными" я имел в виду не большие проекты, а программы, сложные алгоритмически, а это не одно и то же.


Дата: Сен 12, 2003 15:40:07

volodya
Я просто хотел показать, что case n: превращается в метку, на которую мы переходим при определенном значении выражения. Причем метка эта может находится внутри операторных скобок. А на обычную метку так не перейтию. Почему такая несправедливость? 8(


Дата: Сен 12, 2003 22:15:57 · Поправил: volodya

Black_mirror

Ну почему несправедливость? Да, действительно, код, мягко говоря, интерестный и я не рассматривал case/switch в таком ракурсе. Поэтому и неспреведливости я тут не усматриваю :) Обычно switch/case используют несколько иначе, при этом имеем код вида:
        call dword ptr func_name[eax*4]
        jmp ....

func_name dd offset func1, offset func2
          dd offset funk3, offset func4


(код продемонстрирован KINDER в другом топике, но суть не меняется).
Этот код применительно к здоровому сегменту switch и ТУЧЕ case мне кажется очень эффективным.


Дата: Сен 12, 2003 23:57:04

Полностью согласен, писать здоровый switch на ассемблере никому не захочется 8)


Дата: Окт 7, 2003 03:43:08 · Поправил: comrade

.

<< . 1 . 2 . 3 . 4 . 5 . 6 . 7 . 8 . 9 .


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.069