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

时间:2018-07-06 13:40:42

标签: c switch-statement conditional-compilation

我正在尝试用另一种功能相同但性能更好(执行时间更少...)的工具替换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};

3 个答案:

答案 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仅包含四种情况,则您可以做很多改进。如果您在此处看到任何类型的速度下降,则在于结果的计算方式(未显示)。