컴파일러

위의 함수에 상수 전파·상수 폴딩·불필요한 코드 제거를 충분히 적용했을 때, 함수가 반환하는 값과 남는 코드로 올바른 것은 무엇인가?

int h(void) {
    int a = 5;
    int b = a * 3;
    int c = b - a;
    if (c > 100) return 0;
    return c * 2;
}
  1. A항상 20을 반환하며, if문의 판정은 삭제된다
  2. B항상 0을 반환하며, return c * 2는 삭제된다
  3. C계산이 모두 남아 있으며, 실행 시에 20 또는 0을 반환한다
정답과 해설 보기

정답: A. 항상 20을 반환하며, if문의 판정은 삭제된다

a = 5를 전파하면 b = 5 * 3 = 15, c = 15 − 5 = 10으로 폴딩할 수 있습니다. 그러면 조건 c > 100은 10 > 100이므로 항상 거짓임을 알 수 있어, return 0의 분기는 결코 실행되지 않는 불필요한 코드로 삭제됩니다. 남는 return c * 2는 10 × 2 = 20이 되어 함수는 return 20;만 남습니다. 조건이 항상 거짓이므로 0을 반환하는 일은 없고, 실행 시에 계산이나 판정을 할 필요도 없습니다.

  • A. 올바릅니다. c = 10이어서 조건이 항상 거짓이 되고 20만 반환하는 코드가 됩니다.
  • B. 조건이 항상 거짓이므로 0을 반환하는 일은 없습니다.
  • C. 모두 상수로 정해지므로 실행 시 계산은 남지 않습니다.
이 분야 연습하기 분야로 돌아가기

컴파일러의 다른 문제

  1. 반복 횟수가 100회인 루프를 본체를 4번 분량 나열하는 루프 전개로 바꿔 쓰면, 횟수 판정과 분기는 몇 번이 되는가? (100은 4로 나누어떨어진다고 가정한다)
  2. C 언어 프로그램에서 실행 파일이 만들어지기까지의 일반적인 흐름으로 올바른 것은 무엇인가?
  3. 생성한 기계어의 짧은 나열을 작은 창으로 보면서, 불필요한 명령의 조합을 더 좋은 명령으로 대체하는 최적화를 무엇이라고 하는가?
  4. 위의 코드에서 sq를 인라인 전개한 뒤 이어서 효과를 내는 최적화와 그 결과로 올바른 것은 무엇인가?
  5. 소프트웨어 파이프라이닝에 대한 설명으로 올바른 것은 무엇인가?

이 분야의 비교