일지
-
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++...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..
-
Effective C++...44일지 2022. 8. 22. 08:51
타입 변환이 바람직할 경우에는 비멤버 함수를 클래스 템플릿 안에 정의해 두자 생성자를 통한 암시적 변환은 컴파일러에게 고려되지 않는다 다음과 같이 생성자에서 암시적 형 변환을 하던 클래스를 템플릿으로 만들면 operator*에 사용되는 T가 무엇인지 알 수 없기 때문에 컴파일 에러가 발생하게 된다. 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) {..
-
Effective C++...43일지 2022. 8. 19. 07:27
"호환되는 모든 타입"을 받아들이는 데는 멤버 함수 템플릿이 직방! 스마트 포인터와 일반 포인터 기본적으로 스마트 포인터는 "++" 연산을 통해 다음 노드로 이동하는 등 포인터에서 지원하지 않는 다양한 기능을 지원한다. 다만 일반 포인터와 달리 스마트 포인터는 암시적 변환을 지원하지 않는다. class Top{ ... }; class Middle : public Top{ ... }; class Bottom : public Middle{ ... }; // 스마트 포인터는 다음과 같은 암시적 변환이 지원되지 않는다. Top* pt1 = new Middle; Top* pt2 = new Bottom; const Top* pct2 = pt1; 스마트 포인터의 암시적 변환 지원 이를 위해서 특정 타입의 생성자를 만..
-
Effective C++...42일지 2022. 8. 18. 07:43
매개변수에 독립적인 코드는 템플릿으로부터 분리시키자 템플릿의 코드 비대화 문제 템플릿을 아무 생각 없이 사용하다 보면 거의 똑같은 코드와 데이터가 여러 벌 중복되어 생성될 수 있다. 이런 문제를 해결하기 위해서는 공통성 및 가변성 분석, 풀어쓰면 만들고 있는 클래스에 다른 클래스와 중복되는 부분이 있으면 해당 부분을 새로운 클래스로 만들고 합성을 통해 공통부분을 유지하는 전략을 사용할 수 있다. 가령 다음과 같이 정방 행렬을 나타내는 템플릿이 존재하는데 해당 클래스에 역행렬을 만들어주는 invert 함수가 존재하는 경우 중복이 발생할 것이다. template class SquareMatrix { public: ... void invert(); }; SquareMatrix sm1; // 크기만 다른 템플릿..