deulee의 개발 노트

고정 헤더 영역

글 제목

메뉴 레이어

deulee의 개발 노트

메뉴 리스트

  • 홈
  • 태그
  • 방명록
  • 분류 전체보기 (112)
    • C++ (79)
      • C++98 (36)
      • Modern C++(11, 14, 17, 20) (34)
      • C++ STL (9)
    • 데이터베이스 (0)
    • 컴퓨터 구조 (0)
    • 운영체제 (0)
    • 읽은 책 (0)
    • 네트워크 (0)
    • 알고리즘 (31)
      • 이론 (5)
      • 문제 (26)
    • 잡글 (1)
      • 아이디어 (0)
      • 해야할 것 (0)
      • 목표 (0)
      • 정보글 (1)
    • git (0)

검색 레이어

deulee의 개발 노트

검색 영역

컨텐츠 검색

분류 전체보기

  • C++ 예외의 비용

    2023.08.09 by deulee

  • C++ 예외 지정

    2023.08.09 by deulee

  • C++ 표준 예외

    2023.08.08 by deulee

  • C++ try 블록 함수

    2023.08.08 by deulee

  • C++ 예외 객체

    2023.08.08 by deulee

  • C++ 예외 처리

    2023.08.08 by deulee

  • C++ 클래스 템플릿

    2023.08.08 by deulee

  • C++ 함수 템플릿

    2023.08.08 by deulee

C++ 예외의 비용

사실 예외 구문을 이용한다는 것에 다소 회의적인 시각도 있다. 왜냐하면 C++의 예외 처리 기능을 사용하면 프로그램의 성능이 눈에 뛸 정도로 느려지기 때문이다. 그리고 호출한 모든 스택을 정리하는 "스택 되감기(stackunwinding)"을 실행한다는 점에서 성능에 얼마나 영향을 줄지 걱정이 된다. 물론 실제로 예외 발생 확률은 굉장히 적으며 정상적인 프로그램이 작동시에 속도를 떨어뜨리지는 않지만 말이다. ㅎㅎ 하지만 try, catch라는 키워드를 쓰는 것만으로도 프로그램의 용량은 커진다. 그리고 사실 여기에는 빈틈이 있다. #include void calc() throw(int) { int* ptr = new int(5); if (/* 예외 발생 */) throw 1; delete p; } int ..

C++/C++98 2023. 8. 9. 09:19

C++ 예외 지정

미처리 예외 throw가 예외를 던졌는데 이를 받아줄 catch가 없는 경우 미처리 예외가 된다. 미처리 예외는 "terminate"라는 함수가 처리하는데 이 함수는 기본적으로 abort를 호출하여 프로그램을 강제로 종료한다. 만약 이를 특별한 방식으로 처리하고 싶다면 예외의 핸들러를 따로 등록할 수 있다. #include terminate_handler set_terminate(terminate_handler ph) // void func(void) 타입의 함수 포인터를 전달함 예시를 한번 보도록 하자. #include #include void myTerm() { std::cout

C++/C++98 2023. 8. 9. 09:08

C++ 표준 예외

C++ 표준 라이브러리는 모든 예외의 루트로 사용할 수 있는 exception이라는 클래스를 정의한다. 이 클래스는 별다른 기능을 가지고 있지는 않고 문자열 포인터를 리턴하는 "what"이라는 가상 함수를 제공한다. (추상 클래스) 표준 라이브러리는 exception으로부터 표준 예외 클래스들을 파생해 놓았고 크게 "논리 에러"와 "런타임 에러"로 나누어진다. 이 표준 예외들은 C++의 연산자들이 던지는 예외들이다. 대표적인 예로 다음 예시를 보도록 하자. C++ 컴파일러는 new 연산자가 할당에 실패할 때 bad_alloc 예외를 발생시킨다. #include int main(void) { try { int* i = new int[100000000]; } catch (std::bad_alloc& b) {..

C++/C++98 2023. 8. 8. 21:22

C++ try 블록 함수

어떤 함수의 본체 어느 곳에서나 예외가 발생할 수 있다면 이 함수의 본체를 try 블록으로 완전히 묶어 버려야 한다. 즉, 다음과 같이 말이다. #include void divide(int a, int d) { try { if (d == 0) throw "0으로는 나눌 수 없다."; std::cout

C++/C++98 2023. 8. 8. 21:13

C++ 예외 객체

1. 예외를 전달하는 방법 사실 예외가 발생했을 때 어떤 종류의 에러가 왜 발생했는지 상세하게 정보를 전달해야 한다. 그래야 호출원에서 에러의 종류를 판단하고 다음 동작을 결정할 수 있다. 전통적인 방법은 정수값을 리턴하여 어떤 종류의 에러가 났는지 판단하는 것이다. 하지만 에러값을 표시할 마땅한 특이값을 선정하기가 무척 어렵고 상황마다 달라야 하는 것이 번거롭다. 그렇다면 열거형은 어떤가? C++의 에러 처리 구문을 이용하여 다음의 예시를 간단하게 만들어 볼 수 있을 것이다. #include enum E_Error { OUTOFMEM, OVERRANGE, HARDFULL }; void Calc()throw(E_Error) { if (/* 예외 발생*/) throw OVERRANGE; } int main..

C++/C++98 2023. 8. 8. 21:02

C++ 예외 처리

1. 예외 처리 C++은 언어 차원에서 예외 처리 문법을 제공한다. try 예외가 발생할만한 코드 블록을 지정함. "try{}" 괄호안에 예외 처리 대상 코드를 작성한다. 이 블록 안에서 예외가 발생했을 때 "throw" 명령으로 예외를 던진다. throw 프로그램이 정상적으로 실행될 수 없는 상황일 때 이 명령으로 예외를 던진다. "throw" 다음에 던지고자 하는 예외를 적는다. 이를 통해 "catch"문으로 점프하게 되며 "throw" 명령 아래쪽의 코드들은 모두 무시되며 곧바로 예외 처리 구문으로 이동한다. catch "try" 블록 다음에 이어지며 던져진 예외를 받아서 처리한다. 그래서 "catch" 블록을 예외 핸들러라고 한다. "catch" 다음에는 받고자 하는 예외의 타입을 적는데 이 객체..

C++/C++98 2023. 8. 8. 16:43

C++ 클래스 템플릿

1. 타입만 다른 클래스들 클래스 템플릿이나 함수 템플릿은 비슷하되 찍어내는 대상이 함수가 아니라 클래스라는 것만 다르다. 다음과 같은 클래스를 보도록 하자. class ValueInt { private: int x, y; int value; // 타입이 int public: ... } class ValueDouble { private: int x, y; double value; // 타입이 double public: ... } 이렇게 위처럼 타입만 다르지 내용은 똑같은 클래스를 다음처럼 하나의 템플릿으로 통합할 수 있다. #include template class Value { private: int x, y; T value; // 타입이 T public: Value(int ax, int ay, T a..

C++/C++98 2023. 8. 8. 15:41

C++ 함수 템플릿

함수 템플릿이란 뭘까? 템플릿(Template)의 사전적 정의는 무엇인가를 만들기 위한 형틀이라는 뜻이다. 즉, 틀은 같은데 집어 넣는 입력에 따라 결과물들이 조금씩 달라진다는 것이다. 1. 함수 템플릿 함수 템플릿은 다음과 같은 상황에서 만들어졌다고 생각하면 된다. void swap(int &a, int &b) { int t; t = a; a = b; b = t; } void swap(double &a, double &b) { double t; t = a; a = b; b = t; } 이 두 함수를 보면 하는 동작 즉, 틀은 똑같은데 매개 변수로 받는 타입(재료)만 다른 것이 보이는가? 즉, 굳이 각 타입별로 함수를 새로 만들어야 할까? 이를 대안해서 나온 방법이 메크로를 사용한다던가, 포인터(void..

C++/C++98 2023. 8. 8. 14:01

추가 정보

인기글

최신글

페이징

이전
1 ··· 4 5 6 7 8 9 10 ··· 14
다음
TISTORY
deulee의 개발 노트 © Magazine Lab
페이스북 트위터 인스타그램 유투브 메일

티스토리툴바