일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 예외
- implicit conversion
- effective stl
- lua
- virtual function
- reference
- c++
- more effective c++
- 티스토리챌린지
- exception
- operator new
- 오블완
- 영화
- 게임
- Effective c++
- 영화 리뷰
- 비교 함수 객체
- UE4
- 스마트 포인터
- 암시적 변환
- 언리얼
- resource management class
- 반복자
- 참조자
- 루아
- Smart Pointer
- 상속
- 다형성
- 메타테이블
- Vector
- Today
- Total
목록개발/Effective STL (45)
스토리텔링 개발자
항목 21. 연관 컨테이너용 비교 함수는 같은 값에 대해 false를 반환해야 한다 같은 값 처리set > s; // 이 경우 처리 순서를 보면..내부 데이터 구조를 뒤지면서 10B를 삽입할 위치를 찾는다.10B가 10A와 같은지 operator!(10A set은 10A와 10B가 동등하지 않다는 결론을 내린다.즉, 비교 함수가 같은 값에 false를 리턴하면 10을 다시 넣으려고 시도하게 된다.(오류)같은 값에 대해 true를 반환하는 비교함수는 모두 이런 결과를 만든다. 주의 사항operator!를 사용하는 비교 연산자 반전을 조심할 것struct StringPtrGreater{ bool operator()(const string* ps1, const string* ps2) const ..
항목 20. 포인터를 저장하는 연관 컨테이너에 대해서는 적합한 비교(비교 함수 객체) 타입을 정해주자 연관 컨테이너 문제set ssp;ssp.insert(new string("Anteater"));ssp.insert(new string("Wombat"));ssp.insert(new string("Lemur"));ssp.insert(new string("Penguin"));for(set::const_iterator i = ssp.begin() ; i != ssp.end() ; ++i){ cout set에 들어있는 값은 포인터이기에 출력물은 16진수 네 개가 한 줄씩 나올 뿐이다.아래와 같이 한다면?// ssp의 문자열을 cout으로 복사한다. 하지만..copy(ssp.begin(), ssp.end..
항목 19. 상등 관계(equality)와 동등 관계(equivalence)의 차이를 파악하자 STL 비교 동작STL의 대부분의 동작은 객체들 사이의 비교 동작이다.find(), insert()이 두 함수는 '두 값이 같은가?'를 알아내는 대표적인 함수이지만, 동작 방식이 상이하다.find상등성(equality)operator==를 사용한다.insert동등성(equivalence)operator 상등성(equality)어떤 표현식 "x == y"가 참이라고 하면 x, y는 같으며, 거짓이면 다르다.하지만, x, y가 같다고 해서 x, y의 모든 데이터 멤버가 같은 값이라는 뜻은 아니다.class Widget{public: ...private: TimeStamp lastAccessed; ..
항목 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()현재 컨테이너에 할당된..