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