【问题标题】:Porting of C++ code with specialized templates to C language [closed]将具有专用模板的 C++ 代码移植到 C 语言 [关闭]
【发布时间】:2018-12-10 14:06:05
【问题描述】:

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

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 实现的宏定义可以接受,但不可取。您还看到了哪些其他选项?

【问题讨论】:

  • 我认为您的示例并不能真正展示您列出的要点,但您所展示的一切都不能用函数指针来完成。
  • “使用c++模板不仅可以减少代码量”:注意这里的“代码量”是指“由程序员”而不是“编译器生成的代码量”。
  • 这个问题真的没有意义。 “我的锤子可以利用套筒扳手的哪些功能?”
  • 您是否尝试过使用函数指针的等效 C 代码?如果是这样,您会注意到在完全优化时实际上没有任何间接调用。
  • 一个 C 宏就可以了。

标签: c++ performance templates refactoring c99


【解决方案1】:

类似:

#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]);
}

【讨论】:

  • “伟大的”performTmpl 很容易写成定义(见编辑)。 (1) 已验证,(2) 也没有电话,(3) 显然你已经做到了
猜你喜欢
  • 1970-01-01
  • 2012-11-16
  • 2010-09-13
  • 2013-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多