컴파일러

최적화를 적용해 컴파일한 프로그램을 디버거로 조사하면 일부 변수의 값이 "표시할 수 없음"으로 나오는 경우가 있다. 주된 이유는 무엇인가?

  1. A최적화를 적용하면 디버거가 프로그램을 전혀 읽어 들이지 못하게 되기 때문
  2. B변수의 값이 컴파일할 때마다 무작위로 바뀌기 때문
  3. C값이 레지스터 재사용이나 계산의 삭제로 남아 있지 않기 때문
정답과 해설 보기

정답: C. 값이 레지스터 재사용이나 계산의 삭제로 남아 있지 않기 때문

최적화에서는 변수를 메모리에 두지 않고 레지스터만으로 다루다가, 다 쓰고 나면 그 레지스터를 다른 값에 재사용합니다. 상수 전파로 계산 자체가 사라지기도 합니다. 그래서 디버거로 멈춘 시점에는 이미 그 변수의 값이 어디에도 남아 있지 않은 경우가 있으며, "최적화로 삭제됨" 등으로 표시됩니다. 디버깅할 때는 최적화를 약하게 하거나 디버그용 최적화 설정을 사용하는 것이 일반적입니다. 디버거가 읽어 들이지 못하게 되는 것은 아닙니다.

  • A. 디버거는 최적화된 프로그램도 읽어 들일 수 있습니다.
  • B. 값이 무작위로 바뀌는 것이 아닙니다.
  • C. 올바릅니다. 레지스터 재사용이나 계산의 삭제로 값이 남아 있지 않기 때문입니다.
이 분야 연습하기 분야로 돌아가기

컴파일러의 다른 문제

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

이 분야의 비교