Việc triển khai hình vuông sau đây tạo ra một loạt các câu lệnh cmp / je như tôi mong đợi về một câu lệnh if bị xiềng xích:
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;
}
}
Và sau đây tạo ra một bảng dữ liệu để trả về:
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;
}
}
Tại sao gcc không thể tối ưu hóa cái đầu vào cái dưới cùng?
Phân tích để tham khảo: https://godbolt.org/z/UP_igi
EDIT: thật thú vị, MSVC tạo bảng nhảy thay vì bảng dữ liệu cho trường hợp chuyển đổi. Và đáng ngạc nhiên, clang tối ưu hóa chúng cho cùng một kết quả.
return
s; các trường hợp không có breaks
, do đó, chuyển đổi cũng có một thứ tự thực hiện cụ thể. Chuỗi if / other có trả về trong mỗi nhánh, ngữ nghĩa trong trường hợp này là tương đương. Việc tối ưu hóa là không thể . Là một ví dụ mẫu, icc không tối ưu hóa bất kỳ chức năng nào.