컴파일러

위의 코드에서 sq를 인라인 전개한 뒤 이어서 효과를 내는 최적화와 그 결과로 올바른 것은 무엇인가?

static int sq(int v) { return v * v; }
int g(void) { return sq(6) + 1; }
  1. A공통 부분식 제거로 g가 sq를 2번 호출하게 된다
  2. B상수 폴딩으로 g는 37을 반환하기만 하는 코드가 된다
  3. 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. 이 코드에는 루프가 없습니다.
이 분야 연습하기 분야로 돌아가기

컴파일러의 다른 문제

  1. 소프트웨어 파이프라이닝에 대한 설명으로 올바른 것은 무엇인가?
  2. 컴파일러가 부동소수점 수의 덧셈 (a + b) + c를 엄격한 설정에서는 a + (b + c)로 마음대로 재배열하지 않는 이유로 올바른 것은 무엇인가?
  3. 컴파일러의 자동 벡터화에서 사용되는 명령의 종류로 올바른 것은 무엇인가?
  4. 컴파일러 최적화가 지켜야 하는 기본 조건으로 올바른 것은 무엇인가?
  5. 코드 생성 단계의 하나인 명령 선택(인스트럭션 셀렉션)에 대한 설명으로 올바른 것은 무엇인가?

이 분야의 비교