2014-04-14 50 views
1

甲函數執行的代碼的某一塊兩次:爲CNT = 0和CNT = 1。目前我使用以下實現:C++內聯閉合類似物

int func { 
    int V1, V2, ... , Vn; 

    #define cnt 0 
     // a block of code: some operations with V1, ... , Vn 
    #undef cnt 

    #define cnt 1 
     // the same block of code 
    #undef cnt 
} 

此代碼是相當難看。使用內聯函數會導致更加醜陋的代碼:我需要通過引用將所有涉及的變量傳遞給函數。因此,我想創建一些封閉。

我不能使用類似

struct Nested { 
    __forceinline void block(const int cnt) { 
     // block of code 
    }; 
}; 

因爲V1,...,VN不應作靜態性能方面的原因。

我嘗試使用lambda函數,但Visual C++ 2013甚至內聯設置爲「任何適合(/ Ob2)」(即使是PGO)也無法內聯,並且這也傷害了性能。

有什麼建議嗎?

+2

這有什麼錯了'for'循環? – yizzlez

+1

你如何存儲lambda?你不使用'std :: function'嗎? – Yakk

+0

For循環由於性能原因不能使用;此外,還有像var_0/var_1這樣的變量可以通過宏#define Var(cnt)((cnt == 0)?var ## _ 0:var ## _ 1)進行訪問。 – user2419798

回答

5

你可以這樣做:

struct func_impl 
{ 
    int V1, V2, ..., Vn; 
    int res; 

    template <int cnt> 
    void blockOfCode() { 
    ... 
    } 
}; 

int func() 
{ 
    func_impl f; 
    f.blockOfCode<0>(); 
    f.blockOfCode<1>(); 
    return f; 
} 

這應該是相當於你#define解決方案。

編輯在評論中,你提到你也有像var ## cnt這樣的變量。這些可以用兩個元素的數組替代,使用模板參數cnt索引他們:

int var[2]; 
var[cnt] = ...; 
+0

在這種情況下,V1,V2,...不會被存儲在寄存器中,對吧?所以這會損害性能。 – user2419798

+0

@ user2419798就像所有與這種細節水平相關的性能問題一樣 - 試試看看(和測量)。 – Angew

+0

在最壞的情況下,問題可以通過一些性能損失來解決。問題是,是否可以在保持相同速度的情況下使代碼更加乾淨和緊湊。 – user2419798