将 switch/case 替换为 #ifdef 或类似的东西

Replace switch/case by #ifdef or something similar

我正在尝试用其他工具替换 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};

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

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

float model_type_results[4] = {result1, result2, result3, result4};

...

return model_type_results[model.model_kernel_type];

我想问题不仅仅是 1 个 case 语句,而是散落着类似 case 语句的代码。

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

传统上,它们只是写成成员函数指针,但是如果有很多对象,使用单个每个 class 函数 table 指针会更 space 有效每个 class.

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

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