為什么循環總是被編譯成“做…?而“風格”(尾跳)?當試圖理解程序集(在編譯器優化中)時,我看到了以下行為:像這樣一個非常基本的循環outside_loop;while (condition) {
statements;}常被編譯成(偽碼) ; outside_loop
jmp loop_condition ; unconditional
loop_start:
loop_statements
loop_condition:
condition_check
jmp_if_true loop_start
; outside_loop但是,如果沒有打開優化,它將編譯成通??梢岳斫獾拇a:loop_condition:
condition_check
jmp_if_false loop_end
loop_statements
jmp loop_condition ; unconditional
loop_end:根據我的理解,編譯后的代碼更像這樣:goto condition;do {
statements;
condition:}while (condition_check);我看不到巨大的性能提升或代碼可讀性提升,那么為什么經常會出現這種情況呢?是否有此循環樣式的名稱,例如“跟蹤條件檢查”?
3 回答

慕姐8265434
TA貢獻1813條經驗 獲得超2個贊
或者失敗,至少進入和超越循環,而不是完全展開的東西,往往運行到1000多個指令。誠然,這是一種時空權衡-但GCC已經通過不展開環路來有效地在這個頻譜上定位,因此它與同時生成巨大的intos和/或outros是非常不一致的。

吃雞游戲
TA貢獻1829條經驗 獲得超7個贊
直到GCC沒有在默認情況下展開循環。不過,我似乎確實在某些場景中展開,例如嵌套循環和矢量化。這太糟糕了,因為特別是矢量化,你最終會得到一些東西,比如一個巨大的序幕和一個巨大的尾聲,然后是一個小的沒有展開的循環體。因此,代碼的大小是巨大的,但都是為了只執行一次的部分的利益。
添加回答
舉報
0/150
提交
取消