일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- lua
- virtual function
- exception
- 티스토리챌린지
- UE4
- 다형성
- 스마트 포인터
- 암시적 변환
- more effective c++
- 언리얼
- effective stl
- c++
- 참조자
- Effective c++
- 루아
- Smart Pointer
- implicit conversion
- 메타테이블
- 반복자
- 게임
- 상속
- 영화
- resource management class
- reference
- 영화 리뷰
- 예외
- 오블완
- Vector
- 비교 함수 객체
- operator new
- Today
- Total
목록티스토리챌린지 (13)
스토리텔링 개발자
항목 18. vector 보기를 돌같이 하자 vector의 문제점STL 컨테이너가 아니다.bool을 담고 있지도 않다. 비트(가짜 bool)로 구현되는 vectorSTL 컨테이너의 조건c가 타입 T의 객체를 담는 컨테이너라면 c에서 operator[]가 지원되어야 한다.T* p = &c[0]; // 이런 코드가 동작해야 한다.// 하지만, vector은 실제로 bool이 들어있지 않은 가짜 컨테이너라서// 아래의 코드는 동작하지 않는다.vector v;bool* pb = &v[0];vector은 공간을 줄이려고 bool을 압축시킨 데이터 표현 방식을 사용하기 때문이다.대개의 컴파일러는 bool을 하나의 비트로 구현하곤 한다.(가짜 bool값)하지만 비트필드는 참조자나 포인터로 만들 수 없다..그러므..
항목 17. 쓸데없이 남은 용량은 "바꿔치기(swap) 묘수"를 써서 없애 버리자 vector의 필요없는 메모리엄청나게 많은 요소가 들어갔다가, 한번에 줄어들면 필요없는 메모리가 벡터에 잔뜩 생긴다.이는 어떻게 처리하면 좋을까?사실, 모던 C++에서는 shrink_to_fit() 함수를 제공한다.벡터의 용량을 현재 크기만큼으로 줄이는 함수이다.string도 지원한다.하지만 이를 지원하지 않는다면 어떻게 해결해야 할까? swap 트릭class Contestant{ ... };vector contestants;...// 많은 요소를 삽입하고// 많은 요소를 제거한다....vector(contestants).swap(contestants); // shrink to fitvector(contestants)..
항목 16. 기존의 C API에 vector와 string을 넘기는 방법을 알아두자 C API배열과 char*를 사용하는 기존 C API들은 여전히 통용되고 있다.이들의 사용을 아예 배제할 순 없기 때문에 넘기는 방법은 알아두는 것이 좋다. 배열 형태로 변환 방법vector v;&v[0]; // 배열 형태로 변환string s;s.c_str(); // char* 형태로 변환 배열(포인터)로 바꿀 시 주의점빈 벡터를 배열로 변경하려 할 시 주의해야 한다.void doSomething(const int* pInts, size_t numInts);vector v;...doSomething(&v[0], v.size());// 헌데, 만약 v가 빈 벡터라면?// &v[0]은 있지도 않은 메모리의 주소..
항목 15. 잊지 말자! string은 여러 가지 방식으로 구현되어 있다는 사실을 string의 구현 방식은 갖가지가 될 수 있다비야네 스트로스트럽(Bjarne Stroucstrup)가 쓴 글, "Sixteen Ways to Stack a Cat" string 객체의 크기는 얼마일까sizeof(string)를 하면 얼마가 나올까?이에 대한 답은 하나가 아니다.char* 포인터 크기와 같은 경우도 있고,string의 크기가 char*의 무려 일곱 배나 되는 경우도 있다. string이 가져야 하는 정보필수적으로 가지는 정보문자열의 크기(즉 길이)(size)문자를 담아두는 메모리 용량(capacity)문자열의 값(문자들)(value)선택적으로 더 추가될 수 있는 정보할당자의 사본(항목 10 참조)..
항목 14. reserve는 필요 없이 메모리가 재할당되는 것을 막아준다 vector와 string의 메모리 증가아래의 네 단계 동작을 통해 재할당(realloc)이 진행된다.(할당-복사-소멸-해제)컨테이너의 현재 용량의 몇 배가 되는 메모리 블록을 새로 할당한다.(대부분 2배)컨테이너가 원래 가지고 있던 메모리에 저장된 모든 요소 데이터(객체)를 새 메모리에 복사한다.원래 메모리에 저장된 모든 객체를 소멸(destroy) 시킨다.원래의 메모리를 해제(dealloc)한다.상당한 비용이 든다.매 단계마다 반복자, 포인터, 참조자가 무효화된다. STL에서 헷깔리는 네 가지 함수size()현재 컨테이너에 들어 있는 요소의 갯수를 알려준다.메모리 총 갯수가 아니다.capacity()현재 컨테이너에 할당된..
항목 13. 동적으로 할당된 배열보다는 vector와 string이 낫다 vector, string을 사용해야 하는 이유1동적 할당 배열의 경우 아래의 부담이 있다.언젠가는 메모리를 해제해야 한다.delete도 메모리 타입에 따라 제대로 써야 한다.delete는 한번만 호출해야 한다.하지만 vector, string은 이 모든 걸 알아서 해준다.2STL 시퀀스 컨테이너이기 때문에 STL의 모든 알고리즘을 사용할 수 있다.물론 배열도 사용 가능하긴 하지만 제한적이다.begin, end, size 같은 멤버 함수가 없다.iterator나 reverse_iterator, value_type 등의 중첩된 typedef 타입이 없다.3구식 코드 이식성 문제도 문제 없다.vector, string 데이터를 배열..
항목 12. STL 컨테이너 쓰레드 안전성에 대한 기대는 현실에 맞추어 가지자 다중 쓰레딩을 지원하는 STL의 동작여러 쓰레드에서 읽는 것은 안전하다.(Multiple readers are safe)여러 쓰레드에서 다른 컨테이너에 쓰는 것은 안전하다.(Multiple writers to different containers are safe) SGI(실리콘 그래픽스사) STL이 이를 지원했다.허나 현재 와서는 개발이 중단되었다.. 컨테이너의 완벽한 쓰레드 안전성 구현을 위해 라이브러리에서 해야할 것컨테이너의 멤버 함수를 호출하는 시간 동안에 컨테이너에 락(lock)을 걸기컨테이너가 만들어 내어 주는 반복자의 유효 기간 동안에 컨테이너에 락을 걸기컨테이너에 대해 실행된 알고리즘의 수행 시간 동안에 컨테..
항목 11. 커스텀 할당자를 제대로 사용하는 방법을 이해하자 커스텀 할당자를 쓰고 싶어지는 경우벤치마킹, 프로파일링, 각종 실험을 통해 디폴트 STL 메모리 관리자(allocator)가 별로라는 결론에 이르렀을 때낮은 메모리 효율, 심각한 단편화(fragmentation) 등allocator가 쓰레드 안전성을 염두에 둔 것이 마음에 들지 않을 때단일 쓰레드 환경에서만 사용할텐데, 동기화 때문에 걸리는 필요 없는 오버헤드를 피하고 싶다.컨테이너에 들어 있는 객체들이 하나의 힙 안에서 관리되는 점 때문에 문제를 느낄 때같은 종류의 객체를 특정한 힙에 모여있게 하여 메모리 참조 위치의 근접성(locality of reference)를 극대화하는 효과를 얻기 부족하다.공유 메모리에 해당하는 특수한 힙을 만들..