컴파일러
위의 코드에서 sq를 인라인 전개한 뒤 이어서 효과를 내는 최적화와 그 결과로 올바른 것은 무엇인가?
static int sq(int v) { return v * v; }
int g(void) { return sq(6) + 1; }
- A공통 부분식 제거로 g가 sq를 2번 호출하게 된다
- B상수 폴딩으로 g는 37을 반환하기만 하는 코드가 된다
- C루프 전개로 v * v가 6번의 덧셈으로 대체된다
정답과 해설 보기
정답: B. 상수 폴딩으로 g는 37을 반환하기만 하는 코드가 된다
sq를 인라인 전개하면 g 안은 return 6 * 6 + 1;이 되어 곱셈의 재료가 모두 상수가 됩니다. 이어서 상수 폴딩을 하면 6 * 6 = 36, 36 + 1 = 37로 계산할 수 있어 g는 37을 반환하기만 하는 코드가 됩니다. 인라인 전개는 호출 비용을 없애는 데 그치지 않고, 이처럼 호출하는 쪽의 값을 사용한 최적화를 가능하게 한다는 것이 큰 장점입니다. 여기에는 루프가 없고, sq를 2번 호출하게 되는 일도 없습니다.
- A. 호출은 오히려 없어집니다.
- B. 올바릅니다. 전개 후에 상수 폴딩이 효과를 내어 37만 남습니다.
- C. 이 코드에는 루프가 없습니다.