일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 |
- reference
- 티스토리챌린지
- resource management class
- 스마트 포인터
- 영화
- 오블완
- 영화 리뷰
- 함수 객체
- exception
- 참조자
- UE4
- 상속
- 게임
- 메타테이블
- 비교 함수 객체
- 예외
- 암시적 변환
- operator new
- implicit conversion
- c++
- Effective c++
- Smart Pointer
- 루아
- lua
- more effective c++
- 언리얼
- 반복자
- effective stl
- 다형성
- virtual function
- Today
- Total
목록2024/11 (16)
스토리텔링 개발자
항목 11. 커스텀 할당자를 제대로 사용하는 방법을 이해하자 커스텀 할당자를 쓰고 싶어지는 경우벤치마킹, 프로파일링, 각종 실험을 통해 디폴트 STL 메모리 관리자(allocator)가 별로라는 결론에 이르렀을 때낮은 메모리 효율, 심각한 단편화(fragmentation) 등allocator가 쓰레드 안전성을 염두에 둔 것이 마음에 들지 않을 때단일 쓰레드 환경에서만 사용할텐데, 동기화 때문에 걸리는 필요 없는 오버헤드를 피하고 싶다.컨테이너에 들어 있는 객체들이 하나의 힙 안에서 관리되는 점 때문에 문제를 느낄 때같은 종류의 객체를 특정한 힙에 모여있게 하여 메모리 참조 위치의 근접성(locality of reference)를 극대화하는 효과를 얻기 부족하다.공유 메모리에 해당하는 특수한 힙을 만들..
항목 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); // 매개변수 이..
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의 ..