Аналогия switch

Есть длинный-длинный switch на тысячу с гаком кейзов на парсере пакетов.
Внимание, вопрос:
эффективнее ли такая штука:
char k;
typedef void(*fptr)();
fptr t[65535];


void a(){k='a';}

void b(){k='b';}

void c(){k='c';}

void* (func)();

void main ()
{
        memset(t,0,sizeof(t));
	t[0]=&a;
	t[1]=&b;
	t[2]=&c;
	unsigned short i;
	cin>>i;
//ключевой кусок
	t[i] ? t[i]() : t[i];
	printf("k=%c",k);
//конец ключевого куска
	_getch();
}


Если нет, то что можете посоветовать?

UPD спасибо ixSci за помощь и упрощение кода.
  • Вопрос задан
  • 3270 просмотров
Решения вопроса 1
ixSci
@ixSci
Ваша «штука» эффективнее как с точки зрения дизайна, так и с точки зреня скорости. switch вообще не лучший выбор.
Только я бы заменил, это
if(t[i]!=NULL){
        g =(void(*)()) t[i];   
        g();   //или g();   - аналогично
        printf("k=%c",k);
    }


на это
t[i] ? t[i]() : t[i];
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Скорее всего или одинаково, или свитч эффективнее.
Производительность свитча от размера не зависит, поскольку всё равно там таблица переходов.
Если цель поднять производительность, я бы посоветовал начать с профилирования и поиска реально тормозящих мест; замена свитча на массив функций в этом отношении ничего не даст.
Ответ написан
golovan
@golovan
1) о какой эффективности вопрос: быстродействие, размер кода, понятность кода?
2) предложенный код однозначно дополнить проверкой допустимого диапазона i.
Ответ написан
rasstroen
@rasstroen
По тестам, что проводил я, грамотно построенный elseif (с самыми часто встречающимися кейсами сверху) на больших объемах отрабатывал намного быстрее аналогичного свитча, которому «самые частые варианты» задать нельзя

(не туда тыкнул, ответ в тред второго комментария)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы