다음 square 구현은 체인 if 문과 같이 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는 스위치 케이스의 데이터 테이블 대신 점프 테이블을 생성합니다. 놀랍게도, clang은 그것들을 동일한 결과로 최적화합니다.
return
s를 무시하고 @ user207421 ; 이 경우에는 no breaks
가 있으므로 스위치도 특정 실행 순서를 갖습니다. if / else 체인은 모든 브랜치에서 리턴을 가지며,이 경우 시맨틱은 동일합니다. 최적화는 불가능 하지 않습니다 . 이에 반해 icc 는 어떤 기능도 최적화하지 않습니다.