如何“优雅地”进行这种条件编译?

时间:2014-03-20 20:47:23

标签: c++ c-preprocessor conditional-compilation

我有一个需要快速运行的代码,我正在优化内循环运行几百万亿次。

为了实现这一点,我在这个内循环中编写了几个不同版本的代码,一些使用了朴素的方法,一些使用了SSE内在函数等等。我做了所有这一切的想法,当我运行它时在特定的硬件组合上,我可以运行测试,看看哪种实现/编译器命令组合最好并运行它。

首先,当它只有两种不同的方法时,我在循环中使用了一个简单的条件编译,如下所示

do
{
    #ifdef naive_loop
    //more code here
    #endif
    #ifdef partially_unrolled_loop
    //more code here
    #endif
}
while( runNumber < maxRun );

后来随着我尝试的变化和不同事物的数量增长,它变成了这个:

#ifdef naive_loop
void CalcRunner::loopFunction()
{
//code goes here
}
#endif
#ifdef partially_unrolled_loop
void CalcRunner::loopFunction()
{
//code goes here
}
#endif
#ifdef sse_intrinsics
void CalcRunner::loopFunction()
{
//code goes here
}
#endif
//etc

然而,这使得我的文件变得庞大而且令人烦恼。 有更优雅的方式吗?

2 个答案:

答案 0 :(得分:4)

您可以使用模板和模板专业化来完成工作。例如:

template <typename T>
class CalcRunner;

template <>
class CalcRunner<naive_loop>
{
   void loopFunction(void){...}
};

template <>
class CalcRunner<partially_unrolled_loop>
{
   void loopFunction(void){...}
};

// Now instantiate what you wanna at compiler time

typename CalcRunner<partially_unrolled_loop> CalcRunner_t

int main()
{
   CalcRunner_t runner;
   runner.loopFunction();
}

答案 1 :(得分:1)

为什么不将不同的实现放在不同的文件中,并有条件地包含正确的实现? 这就是人们通常对多平台代码所做的事情。