慕容708150
2019-06-24 13:29:15
為什么循環(huán)總是被編譯成“做…?而“風(fēng)格”(尾跳)?當(dāng)試圖理解程序集(在編譯器優(yōu)化中)時(shí),我看到了以下行為:像這樣一個(gè)非?;镜难h(huán)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但是,如果沒(méi)有打開(kāi)優(yōu)化,它將編譯成通常可以理解的代碼:loop_condition:
condition_check
jmp_if_false loop_end
loop_statements
jmp loop_condition ; unconditional
loop_end:根據(jù)我的理解,編譯后的代碼更像這樣:goto condition;do {
statements;
condition:}while (condition_check);我看不到巨大的性能提升或代碼可讀性提升,那么為什么經(jīng)常會(huì)出現(xiàn)這種情況呢?是否有此循環(huán)樣式的名稱(chēng),例如“跟蹤條件檢查”?
3 回答

慕姐8265434
TA貢獻(xiàn)1813條經(jīng)驗(yàn) 獲得超2個(gè)贊
或者失敗,至少進(jìn)入和超越循環(huán),而不是完全展開(kāi)的東西,往往運(yùn)行到1000多個(gè)指令。誠(chéng)然,這是一種時(shí)空權(quán)衡-但GCC已經(jīng)通過(guò)不展開(kāi)環(huán)路來(lái)有效地在這個(gè)頻譜上定位,因此它與同時(shí)生成巨大的intos和/或outros是非常不一致的。

吃雞游戲
TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超7個(gè)贊
直到GCC沒(méi)有在默認(rèn)情況下展開(kāi)循環(huán)。不過(guò),我似乎確實(shí)在某些場(chǎng)景中展開(kāi),例如嵌套循環(huán)和矢量化。這太糟糕了,因?yàn)樘貏e是矢量化,你最終會(huì)得到一些東西,比如一個(gè)巨大的序幕和一個(gè)巨大的尾聲,然后是一個(gè)小的沒(méi)有展開(kāi)的循環(huán)體。因此,代碼的大小是巨大的,但都是為了只執(zhí)行一次的部分的利益。
添加回答
舉報(bào)
0/150
提交
取消