高效的函数调用

时间:2012-08-20 14:26:55

标签: c

我需要你帮助写一个有效的程序。

我有大约50个函数说call_1()call_2() ... call_50()。我需要根据从数据包中读取的索引来调用它们,即数据中的字段是否需要调用call_25(),如果是10那么call_10()

我已将此写入if if条件,如

if (index == 5) 
    call_5() 
elseif (index == 6)
   ..so on .. 

但我认为这不是有效的写作方式。实现这种情况的任何其他想法? 函数指针可以帮助吗? 感谢您的帮助。感谢。

6 个答案:

答案 0 :(得分:6)

是的,使用函数指针的查找表:

typedef void(*fp)(void);

void call_01(void);
void call_02(void);
/* ... */

fp functions[] = { &call_01,
                   &call_02,
                   /* ... */
                 };

void call()
{
    unsigned int n = get_index();
    functions[n]();
}

答案 1 :(得分:1)

如果所有50个函数的参数相同,请使用函数指针数组:

typedef void (*FieldHandler)(void);

const FieldHandler handlers[50] = { call_0, call_1, /* ... and so on ... */ };

然后你只需索引数组并调用:

handlers[index]();

答案 2 :(得分:1)

如果所有函数都具有相同的签名,则可以轻松使用函数指针数组。

typedef void (*func)(void);
...
func dispatch_table[] = {
   func0,
   func1,
   func2,
...
   func50,
};

后来像这样使用

int function_index = packet_get_func_index( packet );
...
dispatch_table[ function_index ]();

答案 3 :(得分:0)

是的,函数指针是这里的方法。

我建议创建一个函数指针表,因为你的输入是一个索引,你只需索引到表中调用正确的函数。

答案 4 :(得分:0)

我使用switch语句:

switch(index) {
  case 1: return call01();
  case 2: return call02();
  case 3: return call03();
}

这不是使用函数指针的代码,而且(imho)更简洁。

答案 5 :(得分:0)

是的,这效率很低。我认为最好的方法是编写一个这种形式的调度程序,范围为0 - 255:

void(* dispatcher [255]);

当然,您需要分配所有必要的函数而不是if语句,但这会更快:

dispatcher['a'] = &call_1;
dispatcher['b'] = &call_2;
dispatcher['c'] = &call_3;
...

然后你可以这样做:

调度程序(索引),它将知道要执行的函数。

希望有所帮助。