2015-08-28 52 views
0

我在C++的for循環,我想在它的內部的「if」子句在下一次迭代中消失(爲了性能),在它檢查值爲真後。這是可能的C++或任何其他語言?動態刪除代碼?

+0

呃......根據你的體系結構以及你想研究多少黑魔法,你可以動態地將「if」命令動態地改變爲「jump」或「nop」指令 - 自修改代碼,但在任何現代系統上,這都不會飛。 –

回答

1

這在C++中是不可能的。一旦編譯完成,就是這樣。但是,你不應該擔心檢查一次值。績效影響不大。

我想如果值檢查是相當複雜的(即不僅僅是簡單的檢查是否是T或F),您可以添加某種標誌來先檢查,然後跳過檢查的其餘部分,如果它是真的。這顯然需要自己的檢查/分配,並且很可能不值得做。

4

動態地改變代碼沒有任何魔力。如果if條件執行起來很便宜,則在循環中執行if子句可能不會非常昂貴。

如果條件是昂貴的評價,你可能要保護它與一個額外的布爾變量:

bool mustCheck = true; 
size_t const n = ...; // number of iterations 

for (size_t i = 0; i < n; ++i) { 
    if (mustCheck && theExpensiveCheck(...)) { 
     mustCheck = false; // turn off the check now 
     .... 
    } 
    ... 
} 

如果目標是執行只在第一次迭代的檢查,你可以測試如果循環指數爲0

for (size_t i = 0; i < n; ++i) { 
    if (i == 0 && theExpensiveCheck(...)) { 
     .... 
    } 
    ... 
} 

不具有if內循環是完全拔出if,並執行另一種選擇它如果循環具有循環之前至少一次迭代:

size_t const n = ...; // number of iterations 

if (n > 0) { 
    // do check and execute loop body for first item 
    if (theExpensiveCheck()) { 
     .... 
    } 
} 

// start regular loop, starting at index 1 
for (size_t i = 1; i < n; ++i) { 
    // execute loop body for other items 
    ... 
} 

的修改上面添加額外的複雜性(從而潛在的bug),你的代碼。如果不清楚循環或if條件是否存在執行問題,我建議不要執行任何這些修改。通常情況下,應用上述修改不會帶來實質性的性能提升,但顯然它取決於if條件。

編譯器現在還提供了幾個強大的循環優化技術,所以你應該確保你正在編譯時打開所有這些優化。