簡體   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