如何为不同的硬件功能设计具有独特实现的过程



假设我有一个函数或过程,我想根据机器的硬件功能集以不同的方式执行。 如果存在功能 A,则执行利用功能 A 的特定代码块。 如果不存在,并且存在功能 B,则执行利用功能 B 的代码。 依此类推,通过 N 个特征。 伪代码如下所示:

function doStuff()
    if (featureA)
        /* Use feature A to do stuff. */
    else if (featureB)
        /* Use feature B to do stuff. */
    else if...
    ...
    else
        /* Do stuff generically. */

显然,扩展if-else可能会变得混乱。 此外,如果这是对性能至关重要的代码部分,最好避免重复的条件检查。

我知道一些针对多个平台的代码设计,例如将特定于平台的实现拆分为同一类或文件的特定于平台的版本。 或者,对于较小的代码段(在 C/C++ 中),#ifdef 可以分隔平台代码。 但是,在这种情况下,平台相同,但硬件可能不同;例如,不同型号的英特尔 CPU。

那么,有没有更好的方法来编写这样的东西? 如何设计函数或围绕函数的代码和结构? 更喜欢可以在C++中应用的答案。

如果您使用带有对象的语言,我只需为每个硬件配置创建子类,并根据可用硬件实例化一个子类。

如果您使用的是 C,并且担心性能,我会创建几个具有相同签名的函数,然后使用函数指针为可用硬件选择一个函数。

例如:

/* global function pointer for doing stuff */
void (*doStuff)(int) = NULL;
/* various available implementations */
void doStuffFeatureA(int n) { ... }
void doStuffFeatureB(int n) { ... }
void doStuffGeneric(int n) { ... }
/* this function MUST be called before you try to do stuff */
void initStuff() {
    if (featureA) {
        doStuff = &doStuffFeatureA;
    } else if (featureB) {
        doStuff = &doStuffFeatureB;
    } else {
        doStuff = &doStuffGeneric;
    }
}

这样,您只需要执行一次硬件检查;将来的函数调用将简单地跳转到正确函数的地址。在尝试使用函数指针之前,您需要确保初始化它,否则程序将崩溃。如果您使用多个线程,则需要格外小心,不要更改多个线程的函数指针。

最新更新