일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- operator new
- Smart Pointer
- 영화
- UE4
- exception
- 언리얼
- effective stl
- 예외
- lua
- 암시적 변환
- 함수 객체
- resource management class
- 비교 함수 객체
- 티스토리챌린지
- more effective c++
- implicit conversion
- 상속
- virtual function
- 메타테이블
- 참조자
- c++
- 게임
- Effective c++
- effective modern c++
- 영화 리뷰
- 스마트 포인터
- reference
- 오블완
- 다형성
- 반복자
- Today
- Total
목록Effective C++ (148)
스토리텔링 개발자
항목 10. 할당자(allocator)의 일반적인 사항과 제약 사항에 대해 잘 알아두자 할당자의 기원16비트 운영체제(DOS) 시절, 라이브러리 제작자들이 near, far 포인터 구분에 힘을 덜 쓸 수 있도록메모리 모델의 추상층으로 개발된 것이다.그처럼 STL 할당자 역시 객체 메모리 관리를 편하게 하기 위해 설계되었다. STL 할당자의 문제몇몇 부분에서 효율성 저하가 판명되었다.사실상 operator new, operator new[]와 동일한 기능이지만, 인터페이스는 전혀 비슷하지 않다.심지어 malloc과도 비슷하지 않다. 할당자의 제약 사항 1. pointer / reference 타입할당자는 자신에게 정의된 메모리 모델의 포인터와 참조자에 대한 typedef 타입을 제공한다.(모던에..
항목 9. 데이터를 삭제할 때에도 조심스럽게 선택할 것이 많다 특정 요소 삭제하기컨테이너의 요소 중 1963이라는 값을 모두 삭제하고 싶다면?컨테이너 종류에 따라 삭제 방법이 다르다.연속 메모리(시퀀스) 컨테이너(vector, deque, string)erase-remove 합성문// erase-remove 합성문// remove : 제거한 요소들을 컨테이너 뒤로 이동시킨다.// 마지막 유효한 값 다음 반복자를 리턴한다.// 컨테이너의 크기는 변하지 않는다.// erase : 반복자 및 반복자의 범위를 컨테이너에서 제거한다.// 삭제된 요소 다음 반복자를 리턴한다.// 컨테이너의 크기가 변한다.c.erase(remove(c.begin(), ..
항목 8. auto_ptr의 컨테이너는 절대로 만들지 말자 COAP(Container Of Auto Ptr) 금지사실 컴파일러가 통과도 시켜주지 않아야 정상이다.게다가 요새는 auto_ptr조차 표준이 아니다.하지만 이 책이 쓰여질 시기에는 이를 허용하는 컴파일러가 있었고, 그것이 문제였다. COAP 금지 이유이식이 불가능하다.표준은 auto_ptr을 컨테이너에 담지 못한다, 이기 때문이다.auto_ptr의 복사 동작이 문제된다. auto_ptr의 복사 동작복사하면, 소유권이 옮겨지고, 기존의 것은 null로 셋팅된다.즉, auto_ptr을 복사하는 것은 '그 포인터의 값을 바꾸는 것이다'라고 할 수 있다.auto_ptr pw1(new Widget); // pw1 = 위젯의 포인터auto_pt..
항목 7. new로 생성한 포인터의 컨테이너를 사용할 때에는 컨테이너가 소멸되기 전에 포인터를 delete하는 일을 잊지 말자 컨테이너의 메모리 해제보통의 경우 컨테이너는 요소의 메모리 해제를 잘 해 주지만..new로 할당된 객체 포인터의 경우 이야기가 다르다.void doSomething(){ vector vwp; for(int i = 0 ; i vwp의 각 요소, 포인터 자체는 소멸되지만, 포인터가 가리키는 공간은 전혀 해제되지 않는다.즉, 아래와 같이 해주어야 한다.void doSomething(){ vector vwp; ... // 예전과 동일 // 해제 처리를 해주어야 한다. for(vector::iterator i = vwp.begin(); i != ..
항목 6. C++ 컴파일러의 어이없는 분석 결과를 조심하자 파일에 들어있는 int의 list를 복사하려는 예시ifstream dataFile("ints.dat");// 잘못 짜여진 코드list data(istream_iterator(dataFile), istream_iterator());컴파일은 잘 된다. 하지만, 런타임에 아무 일도 하지 않는다.파일에서 데이터를 전혀 읽지 않으며,심지어 리스트조차 만들지도 않는다.사실 위의 코드는 list 객체를 선언하지도 않았고, 생성자를 호출하지도 않았다! 함수 선언문// 아래는 모두 함수 선언문이다.int f(double d);int f(double (d)); // d를 둘러싼 괄호는 무시int f(double); // 매개변수 이..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cKXMrC/btsKyzjFe1P/zFqzk8nAUcMPwwrDMHVTb1/img.png)
v1에 v2의 뒤쪽 반을 채우는 가장 빠른 방법은?v1.assign(v2.begin() + v2.size() / 2, v2.end());assign 멤버 함수컨테이너의 대용을 완전히 교체하고 싶다면 이 함수를 우선적으로 고려하자.이는 범위(두 반복자를 사용하여 나타내는 요소 묶음) 단위로 동작하는 멤버 함수이다.범위 멤버 함수를 사용하지 않고 이 문제를 풀려면 루프를 사용하지 않을 수가 없다.직접 루프를 사용하는 건 지양하자. (항목 43 참조) 범위 멤버 함수(range member function)두 개의 반복자를 시작과 끝으로 하는 범위를 매개변수로 하는 멤버 함수를 말한다. 다른 해결법들다른 방법 1. 루프와 단일 요소를 사용한 코드vector v1, v2;...v1.clear();for(..
항목 4. size()의 결과를 0과 비교할 생각이라면 차라리 empty를 호출하자 size와 empty의 용법// size를 사용if(c.size() == 0)// empty를 사용if(c.empty()) empty를 선호해야 하는 이유empty는 모든 표준 컨테이너에 대해 상수 시간에 수행되지만..list 컨테이너의 경우 간혹 컴파일러에 따라 size가 선형 시간에 수행되기도 하기 때문이다.이 경우가 꽤 빈번하다. list가 상수 시간 size를 제공하지 않는 경우, 왜 그럴까.리스트의 splice 함수와 밀접한 관계가 있다.list list1;list list2;...// list2의 노드 중// 제일 먼저 5가 나타나는 부분부터// 제일 먼저 10이 나타나는 부분까지를// list1의 ..
항목 3. 복사(Copy)는 컨테이너 안의 객체에 맞게 비용을 최소화하며, 동작은 정확하게 하자 컨테이너의 요소기본적으로 STL 컨테이너는 삽입, 삭제 시 복사 처리를 한다.컨테이너가 가진 객체는 넣을 당시의 것과 같은 것이 아니다.컨테이너에서 객체를 가져와도, 컨테이너에 있었던 것이 아니다.컨테이너 내부의 객체조차도 늘 같은 것이라 보장할 수 없다.vector 등에 insert를 통해 데이터를 삽입하거나, erase로 지우거나 하는 경우.컨테이너의 객체들은 복사를 통해 밀려나고 밀려온다.(항목 5, 항목 14 참조)정렬 알고리즘이나 그와 비슷한 매커니즘의 함수를 호출하는 경우.next_permutation, previous_permutation, remove, unique / rotate, reve..