我在C++的for循環,我想在它的內部的「if」子句在下一次迭代中消失(爲了性能),在它檢查值爲真後。這是可能的C++或任何其他語言?動態刪除代碼?
Q
動態刪除代碼?
0
A
回答
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
條件。
編譯器現在還提供了幾個強大的循環優化技術,所以你應該確保你正在編譯時打開所有這些優化。
相關問題
- 1. jquery動態添加/刪除代碼段
- 2. 如何動態刪除Django HTML代碼
- 3. 代碼刪除
- 4. 刪除HTML代碼
- 5. 刪除,替換或禁用動態生成的ASP.Net js代碼
- 6. 如何從代碼中動態刪除div標籤?
- 7. 動態加載和刪除JS代碼從DOM和內存
- 8. 如何使用動態刪除重複代碼
- 9. 刪除簡碼(有代碼)
- 10. 動態刪除SectionIndex
- 11. 刪除動態gridview
- 12. 動態刪除JPanel
- 13. 動態刪除angular.module()
- 14. listitem - 刪除 - 動態
- 15. 與刪除動態移除
- 16. 刪除/刪除Firebase動態鏈接
- 17. 刪除/刪除動態加載的javascript
- 18. 刪除動態添加腳本動態
- 19. 刪除樣板代碼
- 20. 刪除重複的代碼
- 21. C#代碼被刪除
- 22. 刪除ASCII顏色代碼
- 23. 刪除惡意代碼
- 24. jquery刪除javascript代碼
- 25. 刪除過多的代碼
- 26. 刪除Parse.File從雲代碼
- 27. 刪除代碼片斷
- 28. 刪除Markdown默認代碼
- 29. JavaScript刪除JQuery代碼
- 30. 從GitHub中刪除代碼
呃......根據你的體系結構以及你想研究多少黑魔法,你可以動態地將「if」命令動態地改變爲「jump」或「nop」指令 - 自修改代碼,但在任何現代系統上,這都不會飛。 –