[英]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.