将带有专用模板的C ++代码移植到C语言

时间:2018-12-10 14:06:06

标签: c++ performance templates refactoring c99

我有很多非常相似的功能,例如

void someLargeFulction1(args)
{
    IDENTICAL CODE
    DIFFERENT CODE 1
    IDENTICAL CODE
}

//---------------------------//
//---------------------------//

void someLargeFulctionN(args)
{
    IDENTICAL CODE
    DIFFERENT CODE N
    IDENTICAL CODE
}

所有这些功能仅在DIFFERENT CODE N部分有所不同(这是一系列浮点运算)。由于大多数someLargeFulctionN代码是相同的,因此我不会避免代码复制,因为这会使代码维护变得非常复杂。减少销售代表是我的主要目标。不幸的是,由于对性能的严重影响,我无法将DIFFERENT CODE组织为函数调用,并且不能将此函数作为someLargeFulction参数传递-DIFFERENT CODE的执行速度比典型的函数调用快得多,由编译器调用内联。我不想将someLargeFulctionN组织为宏定义(但是这可能是解决方案)。

在C ++编程语言中,我有一个非常简单且有用的解决方案-模板函数。我可以做类似的事情:

template <int N>
void someLargeFulction(args)
{
    IDENTICAL CODE
    differentCode<N>();
    IDENTICAL CODE
 }

并针对所有变体专门化differentCode()函数。对于所有经过测试的编译器(g ++,MVSC),它都很棒!编译器总是内联differentCode调用,并且我有必要数量的someLargeFulction变体。问题是,现在我需要将此代码移植到С98。为了直接解决问题,我需要创建完整数量的someLargeFulction副本,这是一个错误的决定。将宏定义与someLargeFulction实现一起使用是可以接受的,但并不可取。您还会看到其他什么选择?

1 个答案:

答案 0 :(得分:0)

类似的东西:

#include <stdio.h>

#define doIt(OP,a,b) do##OP(a,b)

#define performTmpl(OP,a,b,c) { for (int i=0; i<10; i++) a[i]=doIt(OP,b[i],c[i]); }

enum { ADD, SUB };

int doADD(int a,int b) { return a+b; }
int doSUB(int a,int b) { return a-b; }

int main() {
        printf("%d\n",doIt(ADD,5,4));
        printf("%d\n",doIt(SUB,5,4));

        int x[10], y[10]={1,2,3,4,5,6,7,8,9,10}, z[10]={1,1,1,1,1,1,1,1,1,1};
        performTmpl(ADD,x,y,z);
        for (int i=0; i<10; i++) printf("%d\n",x[i]);
}