본문 바로가기

전체 글57

항목 51. new 및 delete를 작성할 때 따라야 할 기존의 관례를 잘 알아두자 operator new, delete 사용자 정의버전의 요구사항을 살펴보자. 1. operator new 요구사항 1) 반환값 - 메모리 할당 가능? 해당 메모리에 대한 포인터 반환 : bad_alloc 타입의 예외; 2) 가용메모리 부족? - 메모리 부족시 new처리자 함수호출하여 2회이상 메모리할당 재시도한다. - operator new가 예외를 던지는 경우 : new처리자 함수에 대한 포인터가 null일때만 3) 크기가 없는 메모리 요청에 대한 대비책 필요 - 0바이트 메모리 요청시 1바이트 요구로 간주하여 처리한다. - (0바이트 요구는 거의없다고 보면된다..) 4) "기본(normal)" 형태의 new가 가려지지 않도록 - 이건 차후 설명하겠다. void * operator new(std::si.. 2020. 5. 12.
항목 50. new a및 delete를 언제 바꿔야 좋은 소리를 들을지를 파악해 두자 컴파일러가 기본 제공하는 operator new, operator delete를 오버로딩을 통해 바꾸고 싶은 경우는 언제 일까? 일반적으로 컴파일러가 제공하는 operator new, operator delete는 대체로 쓸만하다. 사용자가 오버로딩을 통해 재정의한다면 수동으로 지정해줄 관례들이 있다. 사용자가 본인의 프로젝트에 알맞은 오버로딩을 구현한다면 훨씬 효율적인 operator new , operator delete가 탄생할 수 있다. 어쨌든, 지금시간에는 언제 operator new, delete를 바꾸어야 하는 지 알아보자. 1. 잘못된 힙 사용을 탐지하기 위해서 - new는 delete하지 않으면 메모리 누수 발생한다. 또한 delete를 중복으로 동작시키면 프로그램은 미정의 동작을 일으킨.. 2020. 4. 1.
항목 49. new 처리자의 동작원리를 제대로 이해하자 1. 메모리 할당 과정 operator new는 메모리 할당이라는 임무를 맡고있으며, 임무실패시 예외를 발생시킨다. 하지만, 예외를 던지기전 사용자 error 처리함수를 선 호출하도록 설계되어있다. 표준라이브러리에서는 사용자 error 처리함수를 set할 수 있는 함수를 준비해놓았다. => set_new_handler namespace std{ typedef void(*new_handler) (); // 함수포인터(new_handler는 매개변수도 없고 반환형도 void인 함수포인터에 typedef를 걸어 놓았다.) new_handler set_new_handler(new_handler p) throw(); // set_new_handler는 이러한 함수포인터(new_handler)를 받고 new_han.. 2020. 4. 1.
항목 48. 템플릿 메타프로그래밍, 하지 않겠는가? 이번장은 저자가 템플릿 메타프로그래밍의 장단점을 보여주고, 권유하는 내용이다. 1. TMP란? - Template Meta Programming의 줄임말이며, 컴파일 도중에 실행되는 템플릿 기반의 프로그램을 작성하는 일을 말한다. TMP프로그램이 실행을 마친 후엔, 그 결과로 나온 출력물(템플릿으로부터 인스턴스화된 C++코드)이 다시 보통의 컴파일 과정을 거친다. 2. TMP의 특징 1) TMP를 쓰면 다른 방법으로는 까다롭거나 불가능한일을 쉽게 할 수 있다. 2) 템플릿 메타프로그램은 C++컴파일이 진행되는 동안 실행되기 때문에, 기존 작업을 런타임 영역 -> 컴파일영역으로 전환할 수 있다. (1) 실행 에러를 컴파일 도중에 찾을 수 있다. (2) 효율적이다. -> 실행 코드, 실행시간, 메모리 차지 .. 2020. 3. 27.
항목 47. 타입에 대한 정보가 필요하다면 특성정보 클래스를 사용하자 템플릿은 컴파일 타임에 인스턴스화 된다. 따라서 다양한 템플릿클래스를 처리하는 함수를 만들때 우리는 특성정보 클래스를 이용하여 컴파일 타임에 해당 클래스가 어떤 타입인지 밝혀낸다. STL에는 컨테이너, 반복자, 알고리즘으로 구성되어있지만, 이 외에 유틸리티라고 불리는 템플릿도 들어 있다. 이들 중 하나가 advance라는 템플릿인데, 이 템플릿의 역할은 반복자를 지정된 거리만 큼 이동시키는 것이다. template void advance(IterT& iter, DistT dist) { // ... } 1. 반복자의 종류 advance를 살펴보기 전에 반복자의 종류5가지를 알아보자. 1) input iterator : 전진만 가능, 한번에 하나만 읽기 가능 2) Output iterator : 전진만 가능.. 2020. 3. 26.
항목 46. 타입 변환이 바람직할 경우에는 비멤버 함수를 클래스 템플릿 안에 정의해 두자. 항목 24를 보고오자. https://browoo.tistory.com/201?category=740173 아래 코드는 항목 24의 코드를 템플릿화한 코드이다. template class Rational{ public : Rational(const T& numerator = 0, const T& denominator = 1); const T numerator() const; const T denominator() const; … }; template const Rational operator* (const Rational& lhs, const Rational& rhs) { … } Rational oneHalf(1, 2); // Rational이 템플릿이라는 점만 빼면 항목24의 예제와 동일하다. Rati.. 2020. 3. 25.