본문 바로가기

서적 정리/Effective C++56

55.Boo子有親! 부스트를 늘 여러분 가까이에 부스트(Boost) 이름은 자주 들어봐서 익숙한 이름이다. 실제로 사용해본적은 없다. 부스트는 C++ 개발자들의 단체이자 무료로 다운로드가 가능한 C++ 라이브러리 집항르 동시에 일컫는 고유명사이다. http://boost.org에 있다. boost 라이브러리 부스트의 라이브러리는 십수 개의 범주로 나뉘어 있다. 대표적인 몇개를 적어본다. 1.문자열 및 텍스트 처리 주요 구성요소로 타입 안전성을 갖춘 printf 비슷한 서식화 기능, 정규 표현식 및 토큰화와 구문분석 기능이 있다. TR1에 있는 정규 표현식이 여기서 나왔다(54장 참고). 2.컨테이너 STL 양식의 인터페이스를 제공하는 고정 크기 배열(54장 참고), 가변 크기 비트세트, 다차원 배열 등이 포함되어 있다. 3.함수 객체 및 고차(high.. 2022. 1. 3.
54.TR1을 포함한 표준 라이브러리 구성요소와 편안한 친구가 되자 시간이 지날수록 C++도 버전업이 된다. 버전업이 되면서 언어 자체의 기능 외의 새로운 기능들이 추가되는데 대부분은 기존 표준 라이브러리에 추가되는 형태로 버전업이 이뤄진다. TR1은 C++ 라이브러리 작업 팀이 작성한 1차 기술 보고서(Technical Report 1)이다. C++ 라이브러리의 주요 구성요소 1.표준 템플릿 라이브러리(Standard Template Library : STL) 주요 구성요소로서 컨테이너(vector, string, map 등), 반복자, 알고리즘(find, sort, transform 등), 함수 객체(less, greater 등) 외에 컨테이너 어댑터와 함수 객체 어댑터(stack, priority_queue, mem_fun, not1 등)가 있다. 2.iostrea.. 2022. 1. 3.
53.컴파일러 경고를 지나치지 말자 학원에서 컴파일러 경고는 항상 인지하고 없게 하도록 하라고 배웠다. 당연시하게 암시적인 캐스팅 경고도 명시적으로 바꿔야하고 그냥 경고는 전부다 지워야한다고 배웠다. 예를들어 float에서 int로 캐스팅도 명시적으로 바꿔야 한다. 만약 내 포트폴리오를 면접관이 심심해서 컴파일했는데 경고가 우수수하게 나오면 어떤 생각을 할지 생각해봐라. 끔찍이란 단어가 떠오른다. class B { public: virtual void f() const; }; class D : public B { public: virtual void f(); }; 가상 함수인 B::f를 D::f에서 재정의 하겠다는 의도인데, B클래스의 f 함수는 상수 멤버 함수이지만, D 클래스의 f 함수는 비상수 멤버 함수이다. 내가 사용하는 visua.. 2022. 1. 3.
52.위치지정 new를 작성한다면 위치지정 delete도 같이 준비하자 malloc과 new의 차이로 new는 생성자를 호출하고 초기화를 해준다는 점이 있다. Widget* pw = new Widget; 위 코드는 함수 두 개가 호출된다. 1.operator new 2.Widget의 생성자 만약 생성자가 호출 중에 예외가 발생했다고 가정해보자. 동적 할당은 했는데 사용자는 메모리 해제할 방법이 없다. pw의 포인터를 찾을 수 없기 떄문이다. 이 경우에 메모리 할당을 안전하게 되돌리는 일을 C++ 런타임 시스템이 해준다. 이때 C++ 런타임 시스템이 해야 할 일은 자신이 호출한 operator new 함수와 짝이 되는 버전의 operator delete 함수를 호출하는 것인데, 오버로드된 여러개의 operator delete 함수들 중에 어떤 operator delete를 호.. 2022. 1. 3.
51.new 및 delete를 작성할 때 따라야 할 기존의 관례를 잘 알아 두자 무언가를 커스터마이징을 할 때 그 대상의 기본적인 기능은 갖춘 상태에서 입맛에 맞게 바꿔야 하는건 당연한 것이다. 사용자 정의 operator new와 operator delete 역시 같다. new와 delete의 기본 요구사항은 뭐가 있을까? new의 기본 요구사항 1.반환 값이 있어야 한다. 2.가용 메모리가 부족할 경우 new 처리자 함수를 호출해야 한다(49장 참고). 3.크기가 없는(0byte) 메모리 요청에 대한 대비책을 갖고 있어야 한다. 기본 요구사항 3가지를 비멤버 버전의 함수를 의사 코드로 구현해보자. void* operator new(std::size_t size) throw(std::bad_alloc) { using namespace std; if (size == 0) size =.. 2022. 1. 2.
50.new 및 delete를 언제 바꿔야 좋은 소리를 들을지 파악해 두자 제목만 보고 뭔 소린가 싶다. 동적 할당을 바꿔야 할 필요가 왜 있는가? 사용자 정의 operator new static const int signature = 0xDEADBEEF; typedef unsigned char Byte; void* operator new(std::size_t size) throw(std::bad_alloc) { using namespace std; size_t realSize = size + 2 * sizeof(int); void* pMem = malloc(realSize); if (!pMem) throw bad_alloc(); *(static_cast(pMem)) = signature; *(reinterpret_cast(static_cast(pMem) + realSize -.. 2022. 1. 1.
49.new 처리자의 동작 원리를 제대로 이해하자 요즘 면접에서 골치인게 가비지 컬렉션(garbage collection)이다. C#이나 자바에서 지원하는 더 이상 사용하지 않는 객체를 자동으로 소멸해주는 기능이다. C++에서는 지원하지 않기에 동적 할당을 하면 명시적으로 소멸해줘야 하는 귀찮음이 생긴다. 스마트 포인터를 사용해서 신경 안쓰고 할 순 있지만, 타이핑하는 것도 귀찮고 해서 그냥 동적 할당하는 편이다. 면접을 보다보면 전혀 생각치도 못한 질문을 받을 때가 많다. 벡터의 원소를 추가하는데 추가할 메모리에 다른 무언가가 이미 할당되어 있다면 어떤 일이 발생하는가? 와 같은 전혀 생각해본 적도 없고 일어난적도 없는 질문들이 날 힘들게 했다. new 처리자(new-handler) 만약 new 연산자가 할당할 여유 메모리가 없을 때 어떤 반응을 할까.. 2021. 12. 29.
48.템플릿 메타프로그래밍, 하지 않겠는가? 템플릿 메타프로그래밍(template metaprogramming : TMP)은 컴파일 도중에 실행되는 템플릿 기반의 프로그램을 작성하는 일을 뜻한다. TMP 프로그램이 실행을 마친 후엔 그 결과로 나온 템플릿으로 부터 인스턴스화된 C++ 소스코드가 다시 보통의 컴파일 과정을 거치는 것이다. 템플릿 메타프로그래밍(TMP)의 장점 1.TMP를 쓰면 다른 방법으로는 까다롭거나 불가능한 일을 쉽게 할 수 있다. 2.C++ 컴파일이 진행되는 동안에 실행되기 때문에, 기존 작업을 런타임 영역에서 컴파일 타임 영역으로 전환할 수 있다. 런타임 영역을 컴파일 타임 영역으로 끌고오기 때문에 실행 도중 터졌던 문제를 컴파일 도중에 찾을 수 있다. 또한, 컴파일 타임에 동작을 다 하기 때문에 실행 코드가 작아지고, 실행 .. 2021. 12. 26.
47.타입에 대한 정보가 필요하다면 특성정보 클래스를 사용하자 STL의 유틸리티(utility)도 컨테이너(container) 및 반복자(iterator)처럼 템플릿으로 구현되어 있는데 유틸리티의 함수중 advance라는 템플릿 함수는 반복자를 지정된 거리만큼 이동시키는 것이다. std::list가 at이 구현이 안되어 있는데 advance를 사용하면 at도 구현할 수 있을 것이다. 나는 반복문 돌려서 ++iter했지만 지금 다시 list를 구현해보라고 하면 advance 사용하는거 고려해 볼 법하다. template _CONSTEXPR17 void advance(_InIt& _Where, _Diff _Off); 실제로 xutility에 이렇게 구현되어 있다. 만약 advance를 직접 구현한다면 어떻게 구현할까? template void advance(IterT&.. 2021. 12. 25.