我想创建一个带有ID和参数struct的函数的单个函数接口。 在内部,调用函数并将结构中的参数传递给函数。返回值传递给struct中的指针。 这个设计有哪些缺陷?有没有比switch-case语句更快的东西?
enum Id{ CALL_1, CALL_2};
struct PARM_1 { int parm1; int parm2; void* data};
struct PARM_2 { int parm1; int* parm2};
void function(int id, void* parm)
{
switch (id)
{
case CALL_1:
{
PARM_1* p = (struct PARM_1*) parm;
function_1(p->parm1, p->parm2, parm->data);
break;
}
case CALL_2:
{
PARM_2* p = (struct PARM_2*) parm;
function_2(p->parm1, p->parm2);
break;
}
default:
break;
}
}
void foo(int parm1,int parm2,void data); void barint parm1,int parm2);
答案 0 :(得分:2)
首先,做手动优化的标准经验法则。通常,手动代码优化没有多大意义,除非:
话虽这么说,C程序员总是要确保他们不会编写愚蠢无效的东西,编译器可以做得很好。例如复杂的嵌套循环结构,复杂的嵌套if-elses,复杂的函数调用,递归等等。
在这种特殊情况下,代码看起来很好,你可以做的不是提高性能。
像这样的开关盒基于具有相邻数字的枚举,是优化器的理想选择。编译器可以将其优化为函数指针数组,每个函数指针对应一个case
。或者直接跳转到直接跳转地址数组。
这不是C程序员需要关注的事情,但是他们可能需要考虑一个每个整数情况都是相邻数字的交换机可能比具有任意随机数的交换机更好地优化。
在这种情况下,唯一的优化问题可能是分支预测。但是,由于您使用的是不同的功能签名,因此并不是一种避免它的方法。如果您可以重写函数以使用相同的签名,则可以稍微优化该函数。但我们在这里谈论纳秒。