首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为不同的硬件特性设计一个具有独特实现的过程?

如何为不同的硬件特性设计一个具有独特实现的过程?
EN

Stack Overflow用户
提问于 2013-09-21 02:42:12
回答 1查看 83关注 0票数 0

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

代码语言:javascript
复制
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++中应用的答案。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-21 02:53:33

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

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

例如:

代码语言:javascript
复制
/* 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;
    }
}

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18928355

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档