我正在尝试用另一种功能相同但性能更好(执行时间更少...)的工具替换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;
}
}
PS:
typedef enum kernel_type {LINEAR, POLY, RBF, SIGMOID};
答案 0 :(得分:8)
正如我已经评论过的,我不相信预处理程序语句就是您要寻找的。要使用预处理条件,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 :(得分:1)
我想问题不仅仅在于1个case语句,还在于充斥着类似case语句的代码。
c ++虚拟函数表是一个类似的概念,用于避免在代码中扩散此类case语句。实际上,在C结构中实现功能表语义并不困难。
传统上,它们只是作为成员函数指针编写的,但是如果每个类中有很多对象,则使用单个的每个类函数表指针的空间效率更高。
答案 2 :(得分:0)
#ifdef
是编译时操作,而不是运行时操作。这不是您在这里寻找的解决方案。
老实说,如果您的switch
仅包含四种情况,则您可以做很多改进。如果您在此处看到任何类型的速度下降,则在于结果的计算方式(未显示)。