스토리텔링 개발자

[More Effective C++] 15. 예외 처리 비용 본문

개발/More Effective C++

[More Effective C++] 15. 예외 처리 비용

김디트 2024. 8. 20. 10:23
728x90

항목 15. 예외 처리에 드는 비용에 대해 정확히 파악하자

 

 

 

객체 생성 성공 여부를 체크하는 자료구조가 소모하는 메모리(항목 10 참조)
  • 컴파일러에 따라선 예외 발생 여부를 꺼버릴 수도 있다.
    • 극단적인 비용 절감을 위해서는 고려해 볼 수도 있을 것이다.
    • 하지만 예외는 C++ 언어의 일부이므로 컴파일러가 이 비용을 완전히 없앨 수는 없다.
      • 프로그램은 여러 개의 독립적인 오브젝트(.obj) 파일로 만들어진다.
      • 하나의 오브젝트 파일이 예외를 사용하지 않는다고, 다른 오브젝트 파일도 그러리란 법은 없다.
      • 오브젝트 파일들이 모두 예외를 사용하지 않는다 쳐도, 링크되는 라이브러리에서 사용한다면?
      • 어느 한 부분이라도 예외를 사용하면, 프로그램 전체가 예외를 지원할 수밖에 없다.
  • 만약, 예외를 지원하지 않는 라이브러리를 만든다면
    • 예외 지원 버전에 비해서 훨씬 작고 빠르다. 하지만..
    • 사용자 코드에서 라이브러리로 예외가 전파되면 안된다.
      • 가상 함수 사용자 재정의와 콜백함수 등을 지원하면 안될 것이다.
      • 솔직히 너무 힘든 일이다..

 

 

 

try 블록으로 인해 생기는 비용
  • try 블록이 작성되기만 해도 무조건 지불해야 하는 비용이다.
    • 오직 try 블록만 작성했을 뿐, 예외가 발생하지 않아도 비용은 증가한다.
    • 이 경우, 컴파일러마다 천차만별이지만, 대략적으로는 5~10% 코드 크기와 실행 속도가 늘어난다.
  • 예외 지정(예외 명세) 기능을 사용해도 try 블록과 비슷한 정도의 비용이 들어간다.

 

 

 

예외가 발생될 때의 비용
  • 솔직히 예외 발생 시 소모되는 비용은 큰 관심사가 되지 못한다.
    • 예외가 발생하는 경우는 극히 드물기 때문이다.
    • 즉, 예외는 "발생될 가능성이 낮은 이벤트"가 일어났다는 것을 가르쳐주는 데이터에 불과하다.
    • 80-20의 법칙(항목 16 참조)에 따르면 이는 프로그램 전체 수행 성능에 미치는 영향이 미미하다는 뜻이다.
  • 하지만 빈번하게 발생하는 상황에 대해 예외 처리를 남발하면 안될 것이다.
    • 통상적인 함수 복귀(return)에 비해 예외 발생(throw)에 의한 함수 복귀 속도는 10의 세 제곱 배(1000배)만큼 느리다.
728x90
Comments