繁体   English   中英

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

[英]How to do this conditional compilation 'elegantly'?

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

为此,我在此内部循环中编写了几种不同版本的代码,其中一些使用的是天真的方法,有些使用的是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

但是,这使我的文件变得庞大而烦人。 有没有更优雅的方法可以做到这一点?

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

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();
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM