การดำเนินการตามตารางต่อไปนี้จะสร้างชุดของคำสั่ง cmp / je อย่างที่ฉันคาดหวังว่าจะถูกล่ามโซ่หากข้อความ:
int square(int num) {
if (num == 0){
return 0;
} else if (num == 1){
return 1;
} else if (num == 2){
return 4;
} else if (num == 3){
return 9;
} else if (num == 4){
return 16;
} else if (num == 5){
return 25;
} else if (num == 6){
return 36;
} else if (num == 7){
return 49;
} else {
return num * num;
}
}
และต่อไปนี้สร้างตารางข้อมูลสำหรับการส่งคืน:
int square_2(int num) {
switch (num){
case 0: return 0;
case 1: return 1;
case 2: return 4;
case 3: return 9;
case 4: return 16;
case 5: return 25;
case 6: return 36;
case 7: return 49;
default: return num * num;
}
}
เหตุใด gcc จึงไม่สามารถปรับค่าตัวแรกให้อยู่ในอันดับต้น ๆ
ถอดแยกชิ้นส่วนเพื่อการอ้างอิง: https://godbolt.org/z/UP_igi
แก้ไข: น่าสนใจ MSVC สร้างตารางกระโดดแทนที่จะเป็นตารางข้อมูลสำหรับกรณีสวิทช์ และที่น่าประหลาดใจคือเสียงดังกราวให้มันได้ผลดีที่สุด
return
s; กรณีที่ไม่มีbreaks
ดังนั้นสวิตช์ยังมีคำสั่งเฉพาะของการดำเนินการ ห่วงโซ่ if / else มีผลตอบแทนในทุกสาขาความหมายในกรณีนี้เทียบเท่า การเพิ่มประสิทธิภาพไม่ได้เป็นไปไม่ได้ ในฐานะที่เป็นตัวอย่างICCไม่ได้เพิ่มประสิทธิภาพฟังก์ชั่นใด ๆ