C语言 用 #ifdef 或类似的东西替换开关/外壳



我正在尝试用其他工具替换switch/case结构,这些工具执行相同的事情,但性能更好(执行时间更短......(,我想到了#ifdef方法,但我不知道在这种情况下如何使用它:

float k_function(float *x,float *y,struct svm_model model)
{
int i;
float sum=0.0;
switch(model.model_kernel_type)  
{
case LINEAR :
return result1;
case POLY :
return result2;
case RBF :
return result3;
case SIGMOID :
return result4;
default :
return 0;
}
}

附言 :

typedef   enum   kernel_type   {LINEAR, POLY, RBF, SIGMOID};

正如我已经评论过的,我不相信预处理器语句是你要找的。若要使用预处理器条件,model.model_kernel_type需要是使用#define语句定义的常量。

我不知道 switch 语句的内部结构,因为它可能是 O(n( 或 O(1(,具体取决于编译器如何处理它。如果你需要确定 O(1( 的时间复杂度,你可以简单地用一个查找表替换你的 switch 语句,如下所示:

float model_type_results[4] = {result1, result2, result3, result4};
...
return model_type_results[model.model_kernel_type];

我想问题不仅仅是 1 个案例语句,而是充斥着类似案例语句的代码。

c++ 虚函数表是一个类似的概念,用于避免这些类型的案例语句在代码中激增。在 C 结构中实现函数表语义实际上并不困难。

传统上,它们只是作为成员函数指针编写的,但如果每个类有许多对象,则使用单个每个类的函数表指针会更节省空间。

#ifdef是编译时操作,而不是运行时操作。 这不是您在这里寻找的解决方案。

老实说,如果你的switch只包含四个案例,你就没有太多可以改进的地方了。 如果您在这里看到任何类型的减速,那就是您的结果是如何计算的(您没有显示(。

最新更新