상세 컨텐츠

본문 제목

C++ 예외의 비용

C++/C++98

by deulee 2023. 8. 9. 09:19

본문

사실 예외 구문을 이용한다는 것에 다소 회의적인 시각도 있다.

 

왜냐하면 C++의 예외 처리 기능을 사용하면 프로그램의 성능이 눈에 뛸 정도로 느려지기 때문이다.

 

그리고 호출한 모든 스택을 정리하는 "스택 되감기(stackunwinding)"을 실행한다는 점에서 성능에 얼마나 영향을 줄지 걱정이 된다. 물론 실제로 예외 발생 확률은 굉장히 적으며 정상적인 프로그램이 작동시에 속도를 떨어뜨리지는 않지만 말이다. ㅎㅎ

 

하지만 try, catch라는 키워드를 쓰는 것만으로도 프로그램의 용량은 커진다.

 

그리고 사실 여기에는 빈틈이 있다.

 

#include <iostream>

void calc() throw(int)
{
	int* ptr = new int(5);

	if (/* 예외 발생 */) throw 1;
	delete p;
}

int main(void)
{
	tyr {
		calc();
	}
	catch (int) {
	}
	return 0;
}

위의 예시와 같이 "동적 할당"된 변수에 대해서는 대응을 하지 못한다는 것이다.

 

"throw" 구문이 실행되게 된다면 그 아래의 코드는 무시되고 바로 스택 되감기를 실행한다. 하지만 그 이전에 생성한 동적 할당된 메모리는 어떻게 할 것인가?

 

물론 포인터처럼 동작하며 스스로 할당된 메모리를 해제하는 스마트 포인터(auto_ptr)를 사용할 수는 있지만 편의성 면에서 비교가 되지 않는다.

 

이 뿐만이 아니다.

 

예외 처리 구문은 "클래스 템플릿에는 쓸 수 없는데 왜냐하면 템플릿으로 전달되는 인수의 타입에 따라 발생할 수 있는 예외가 너무 많기 때문이다".

 

또한, "멀티 스레드"에서도 예외를 처리하기가 무척 곤란하다.

 

사실 그리고 단일 함수내에서 발생하는 간단한 예외는 "if" 문으로 해결하는 것이 더 보기 좋고 깔끔하다.

 

그렇기 때문에 적절한 상황에서 사용하는 것을 추천한다.


출처

http://www.soen.kr/lecture/ccpp/cpplec.htm

 

C/C++ 강좌

 

www.soen.kr

 

'C++ > C++98' 카테고리의 다른 글

C++ Cast 연산자  (0) 2023.08.09
C++ RTTI  (0) 2023.08.09
C++ 예외 지정  (0) 2023.08.09
C++ 표준 예외  (0) 2023.08.08
C++ try 블록 함수  (0) 2023.08.08

관련글 더보기