Вы можете использовать массив с указателем на функции, если ваши условия в основном соседние.
typedef void ( *case_func )( type1 param1, type2 param2 );
void case_func1( type1 param1, type2 param2 );
void case_func2( type1 param1, type2 param2 );
void case_func3( type1 param1, type2 param2 );
void case_func5( type1 param1, type2 param2 );
case_func func_array[] =
{
&case_func1,
&case_func2,
&case_func3,
NULL, // Just a place holder, for non-contiguous values.
&case_func5
};
int myloop(int a, .....){
/* some stuff */
// Critical loop
while(...)
{
if ( func_array[ a ] && a < sizeof( func_array ) )
func_array[ a ]( .... );
}
}
Если вы можете быть уверены, что в вашем массиве не будет дыр и что a
никогда не будет выходить за границы массива, вы можете пропустить if ( func_array[ a ] && a < sizeof( func_array ) )
, уменьшив код до совсем не сравниваемого.
В любом случае, этот подход может быть немного понятнее и может стоить, даже если он не дает большого прироста производительности.