컴파일러

위의 코드에 상수 전파와 상수 폴딩을 반복해서 적용하면 최종적으로 어떤 코드가 되는가?

int n = 8;
int m = n * 2;
return m + 1;
  1. Areturn n * 2 + 1;
  2. Breturn 8 * 2 + m;
  3. Creturn 17;
정답과 해설 보기

정답: C. return 17;

상수 전파에서는 n에 8이 들어간 뒤 변경되지 않으므로 n을 사용하는 곳을 8로 치환하여 m = 8 * 2로 합니다. 상수 폴딩으로 8 * 2를 16으로 계산하면 m = 16이 되고, 다시 전파와 폴딩으로 m + 1은 16 + 1 = 17이 됩니다. n과 m의 대입은 사용되지 않게 되므로 불필요한 코드로 삭제되어 return 17;만 남습니다. 도중에 멈춘 형태나 치환을 잘못한 형태는 최종 결과가 아닙니다.

  • A. n이 아직 남아 있어 전파가 끝나지 않았습니다.
  • B. 치환이 잘못되었고 계산도 끝나지 않았습니다.
  • C. 올바릅니다. 8 → 16 → 17로 계산이 진행되어 상수만 남습니다.
이 분야 연습하기 분야로 돌아가기

컴파일러의 다른 문제

  1. 위의 코드에 공통 부분식 제거를 적용했을 때의 설명으로 올바른 것은?
  2. 불필요한 코드의 삭제(데드 코드 제거)로 제거되는 것으로 올바른 것은?
  3. 함수 인라인 전개의 장점과 단점의 조합으로 올바른 것은?
  4. 루프 전개(루프 언롤링)의 주된 효과로 올바른 것은?
  5. 위의 루프에서 루프 불변식의 이동(루프 밖으로의 이동) 대상이 되는 계산은? (x, y는 루프 안에서 변경되지 않는다고 한다)

이 분야의 비교