Effective C++
-
[Effective C++] new와 delete를 내 맘대로프로그래밍 기초/C++ 2022. 8. 30. 07:20
new와 delete를 내 맘대로 new 처리자의 동작 원리를 제대로 이해하자예외 발생 시 호출되는 함수 C++에는 예외 발생 시 사용자의 함수를 호출해주는 예외 지정이라는 기능이 존재한다.void outOfMem(){ std::cerr std::abort();}int main(){ std::set_new_handler(outOfMem);} 이러한 함수를 구현할 때는 다음 중 하나의 동작이 반드시 이뤄져야 한다.사용할 수 있는 메모리를 더 많이 확보한다.다른 new 처리자를 설치한다.new 처리자의 설치를 제거한다.예외를 던진다.복귀하지 않고 프로그램을 종료한다. new 및 delete를 언제 바꿔야 좋은 소리를 들을지를 파악해 두자new, delete를 바꾸는 이유일반적으로 다음과 같..
-
Effective C++...50일지 2022. 8. 29. 11:42
위치 지정 new를 작성한다면 위치 지정 delete도 같이 준비하자 위치 지정 new 란? 위치 지정 new는 기본적인 operator new에 새로운 매개변수를 전달해주는 형태의 new를 말한다. class Widget { public: ... static void* operator new(std::size_t size, std::ostream& logStream) throw(std::bad_alloc); }; 위치 지정 new와 delete가 짝이 되지 않으면 생기는 문제 C++의 런타임 시스템은 new에서 에러가 발생했을 때 자동적으로 operator delete를 호출해준다. 그런데 여기에는 한 가지 조건이 붙는데 operator new와 매개변수의 개수와 타입이 동일한 버전의 operator ..
-
Effective C++...49일지 2022. 8. 28. 13:00
new 및 delete를 작성할 때 따라야 할 기존의 관례를 잘 알아 두자 operator new의 관례 new는 몇 가지 관례가 존재하는데 먼저 0바이트가 요구되었을 때도 적법한 포인터를 반환해야 한다는 것이다. 이에 대해서는 0바이트가 요구될 때는 1바이트로 가정해서 작업을 진행한다. void* operator new(std::size_t size) throw(std::bad_alloc) { using namespace std; if (size == 0) { size = 1; } while(true) { if (할당 성공) return 할당된 메모리의 포인터; // 할당 실패 시 new 처리자 함수가 있으면 그것을 실행, 아니면 bad_alloc 예외를 발생시킨다. } } 또, operator new..
-
Effective C++...48일지 2022. 8. 27. 12:11
new 및 delete를 언제 바꿔야 좋은 소리를 들을지를 파악해 두자 new, delete를 바꾸는 이유 일반적으로 다음과 같은 이유로 new와 delete를 새로 만들곤 한다. 잘못된 힙 사용을 탐지하기 위해 한 번 new 한 메모리를 두 번 이상 delete 하는 것을 막기 위해 메모리 목록을 저장하는 식으로 사용한다. 메모리를 넘어서 쓰는 것을 막기 위해 메모리 앞, 뒤에 탐지용 바이트 패턴을 넣어두는 식으로 에러를 탐지한다. 효율을 향상 시키기 위해 기본 제공 new, delete는 보편적인 상황을 위해 만들어졌다. 개발자가 자신의 프로그램의 동적 메모리 할당 성향을 잘 파악하고 있으면 새로 new, delete를 만드는 게 더 나을 수 있다. 동적 할당 메모리의 실제 사용에 관한 통계 정보를 ..
-
[Effective C++] 템플릿과 일반화 프로그래밍프로그래밍 기초/C++ 2022. 8. 25. 08:05
템플릿과 일반화 프로그래밍 템플릿 프로그래밍의 천릿길도 암시적 인터페이스와 컴파일 타임 다형성부터 명시적 인터페이스와 암시적 인터페이스 기본적으로 소스 코드에서 명시되어 있는 인터페이스를 명시적 인터페이스라고 하고 표현식에서 지원해야 하는 인터페이스를 암시적 인터페이스라고 한다. 다음 코드에서 명시적 인터페이스와 암시적 인터페이스의 예를 확인할 수 있다. template void doProcessing(T& w) { // T는 operator.!=로 someNastyWidget과 비교할 수 있는 연산을 암시적으로 지원하고 // "w.size() > 10 && w != someNastyWidget"의 결과가 bool 이라는 것을 암시적으로 지원한다. if (w.size() > 10 && w != someN..
-
Effective C++...46일지 2022. 8. 24. 07:43
템플릿 메타 프로그래밍, 하지 않겠는가? TMP의 장점 TMP에는 크게 두 가지 장점이 존재한다. 까다롭거나 불가능한 일을 쉽게 처리할 수 있다. 기존 작업을 런타임 영역에서 컴파일 영역으로 전환할 수 있다. 실행 도중에 잡혀 오던 에러를 컴파일 도중에 찾을 수 있다. 효율적일 여지가 많다. 실행코드가 작아진다. 실행 시간이 짧아진다. 메모리도 적게 잡아먹는다. TMP의 반복 처리 TMP는 루프가 존재하지 않기 때문에 재귀를 이용해 반복 처리를 하게 된다. template struct Factorial { // 이 경우 재귀를 통해 구현이 되며 모든 계산이 컴파일 타임에 이루어진다. enum { value = n * Factorial::value }; }; template struct Factorial ..
-
Effective C++...45일지 2022. 8. 23. 07:50
타입에 대한 정보가 필요하다면 특성 정보 클래스를 사용하자 STL 반복자의 종류 STL에서 지원하는 반복자는 다음의 다섯 종류가 존재한다. 입력 반복자 전진만 가능, 한 칸씩만 이동, 가리키는 위치에서 읽기만 가능, 읽기 가능 횟수 1회 / 읽기 전용 파일 포인터 출력 반복자 전진만 가능, 한 칸씩만 이동, 가리키는 위치에서 쓰기만 가능, 쓰기 가능 횟수 1회 / 쓰기 전용 파일 포인터 순방향 반복자 입력 반복자, 출력 반복자 처리 가능, 읽기 쓰기 동시에 가능, 횟수 제한 없음 / 해시 컨테이너에서 사용 양방향 반복자 순방향 반복자 처리 가능, 뒤로 이동 가능 / list, map, multimap 등에서 사용 임의 접근 반복자 양방향 반복자 처리 가능, 임의의 거리만큼 상수 시간에 이동 가능 / ve..