隨著f0和f1如下,
long long b;
void f0(int a) {
a %= 10;
if (a == 0) b = 11;
else if (a == 1) b = 13;
else if (a == 2) b = 17;
else if (a == 3) b = 19;
else if (a == 4) b = 23;
else if (a == 5) b = 29;
else if (a == 6) b = 31;
else if (a == 7) b = 37;
else if (a == 8) b = 41;
else if (a == 9) b = 43;
}
void f1(int a) {
a %= 10;
if (a == 0) b = 11;
else if (a == 1) b = 13;
else if (a == 2) b = 17;
else if (a == 3) b = 19;
else if (a == 4) b = 23;
else if (a == 5) b = 29;
else if (a == 6) b = 31;
else if (a == 7) b = 37;
else if (a == 8) b = 41;
else if (a == 9) b = 43;
else __builtin_unreachable();
}
假設引數a始終是積極的程式,編譯器應該產生更優化的代碼f1,因為f0,a可以通過的if-else塊落下時為負,所以編譯器應該產生一個默認的“不執行任何操作,并回傳”代碼。然而,在 中f1, 的可能范圍a被明確說明,__builtin_unreachable以便編譯器不必考慮何時a超出范圍。
不過,f1實際運行速度較慢,所以我拆解了一下。這是 的控制流部分f0。
jne .L2
addq $11, b(%rip)
ret
.p2align 4,,10
.p2align 3
.L2:
cmpl $9,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/378671.html
標籤:c assembly gcc compiler-optimization unreachable-code
上一篇:關于CRC16計算的說明
下一篇:分段錯誤(核心轉儲)C
