|
|
| Посл.отвђт | Сообщен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 . |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.069 |