C++ 如何为不同的硬件功能设计具有独特实现的过程?
假设我有一个函数或过程,我希望根据机器的硬件功能集以不同的方式执行。如果存在功能A,则执行利用功能A的特定代码块。如果没有,并且功能B存在,则执行利用功能B的代码。等等,通过N个特性。伪代码如下所示:C++ 如何为不同的硬件功能设计具有独特实现的过程?,c++,optimization,C++,Optimization,假设我有一个函数或过程,我希望根据机器的硬件功能集以不同的方式执行。如果存在功能A,则执行利用功能A的特定代码块。如果没有,并且功能B存在,则执行利用功能B的代码。等等,通过N个特性。伪代码如下所示: function doStuff() if (featureA) /* Use feature A to do stuff. */ else if (featureB) /* Use feature B to do stuff. */ els
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
s可以分离平台代码。然而,这是一种平台相同,但硬件可能不同的情况;例如,不同型号的英特尔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;
}
}
这样你只需要做一次硬件检查;未来的函数调用将直接跳转到正确函数的地址。您需要确保在尝试使用函数指针之前初始化它,否则您的程序将崩溃。如果你使用多个线程,你需要格外小心,不要从多个线程中改变函数指针。什么编程语言?我最感兴趣的是C++中的一些东西。我相信一个共同的模式是将函数指针的初始值设置为初始化函数。因此,第一次调用它时,它会自动设置自己。@Textmode这听起来是一个获得额外学分的好方法。:-)