14. BOOST::VARIANT
• C++에 Union
• Which() 멤버함수로 어떤 타입이 들어있는지 알 수 있음
• Boost::any와 비슷
• Variant는 실체 형태가 실행시에 동적으로 변화는 일종의 다양한 형태도 생각
할수 있기
때문에 Visitor패턴을 구현할 때 상당히 편리하다
18. BOOST::RANDOM
• 표준 rand와는 다른 rand 함수를 제공
• 1. generator 생성(의사 난수 발생기)
• 2. 범위 설정 후 범위를 넘겨 난수 발생
• 3. seed값을 멤버함수로 값을 넘겨줌
• 4. 만들어준 generator와 범위를 boost::variate_generator로 전달
23. BOOST::FUNCTION
• 함수포인터 및 멤버함수, 함수 객체, bind에 의해 만들어진 함수객체등을 격납
할 수 있는 객체
• 커맨드 패턴으로 활용 가능
• Loki 라이브러리에 Functor 클래스와 유사 (대안)
• 주로 Boost::binder와 조합하여 사용
26. BOOST.FUNCTION > FUNCTION POINTER
• Boost.Function 은 임의 호환성이 잇는 함수 오브젝트를 저장 가능하다.
(함수포인터는 완전 같은 시그니쳐를 가진 함수 밖에 받아 들이지 않는다).
• Boost.Function은 인수의 구속등의 함수 오브젝트를 만들어 내는 라이브러리와
공용 할 수 있다.
• Boost::Function을 사용하면 빈 함수 오브젝트를 호출 할 때에
그 일이 알 수 있도록 동작 한다.
27. FUNCTION POINTER > BOOST.FUNCTION
• 함수 포인터는 사이즈가 작다.
( 함수 포인터는 포인터 1개, Boost.Function은 포인터 3개) .
• 함수포인터는 빠르다
(Boost.Function 는 함수 포인터를 통한 호출을 2회 할 가능성이 있다).
• 함수 포인터는 C의 라이브러리와 하위 호환성이 있다.
• 에러 메시지가 읽기 쉽다.
38. BOOST::POOL
• 고정 크기의 블럭(Chunk)들을 할당할때 고속으로 작동하는 메모리 할당 관리
자
• 메모리 사용시 속도와 단편화 문제를 해결하기 위해 사용
• 할당 범위 초과시 2배씩 커짐
• Pool 객체가 소멸될때 자동으로 해제 되므로 new delete 필요 없음
• boost::pool <- 기본 Pool 인터페이스
• boost::object_pool <- 객체 기반의 Pool 인터페이스
• boost::singleton_pool <- 정적 기반의 thread safe singleton으로서의 기본 Pool 인
터페이스
• boost::pool_alloc <- singleton_pool에 기초를 둔 표준 allocator 인터페이스
54. BOOST::TIMER
• C의 clock()으로 구현되어 있는 timer
• 생성자나 restart를 부른 시점부터 경과시간을 전달
• Clock()과 거의 마찬가지이나 뺄셈을 하는거보다 가독성과 빠른 코딩 가능
55. BOOST::PROGRESS_TIMER PROGRESS_DISPLAY
• 변수 영역이 끝나는 시점에 소멸자로부터 불려지게 하는 방식의 Timer
• 함수의 return, break, 예외처리등 상관없이 불려지므로(자동처리 소멸자에서
처리 하면 깔끔)
(ex : auto_ptr)
• (모래시계 만들기..멀티스레드용 크리티컬섹션의 Lock/Unlock처리)등에 유용
progress_display
• ++연산 호출시 막대그래프가 갱신되는 형태
59. BOOST::FORMAT
• Iostream 형태의 스타일을 극복하기 위한 라이브러리
• Iostream은 출력포맷지정이 귀찮으며 << 가 많을 경우 가독성 떨어짐
• 형식. 인자의 개수에 관해서 안전
• 새로 만든 형식이라도 확장이 가능
• 가변의 인수를 사용하지 않고 operator%를 받아 formatter측의 형식에서
정보가 제대로 넘겨지게 하는 원리
• 즉.. 형식이 안전한 C++스타일의 printf같은 것
72. BOOST::SCOPE_EXIT
• 영역(Scope)내에 후처리를 쉽게 할 수 있도록 하는 라이브러리
• 예외 탈출, return, 정상완료 상관없이 가장 마지막에 호출
• D 언어의 Scope(exit)
• SAFE_DELETE 같은거 미리미리 넣어주기 등에 편리
76. BOOST::UNORDERED_MAP, UNORDERED_SET
• 해쉬를 사용한 O(1)로 요소액세스 가능한 set과 map (Std::map,set -> R-B 트리 사
용)
• 고속으로 요소에 액세스 접근 가능
• 기존 std::set map과 완전 동일한 인터페이스
• Gcc4 vc9 이전 환경에서는 사용 불가
81. AUTO_PTR
• - 소유권 독점 방식으로 구동되는 스마트포인터, 복사시 소유권 이전되는 소
유권 독점방식
• - C++ 표준
• - 소유권 이전 금지 - const 사용
• (ex : const boost::auto_ptr<MyClass> aPtr(new MyClass);
• - 자동으로 포인터에 할당된 메모리를 해제
• - 자동으로 포인터 초기화 (디폴트 생성자)
• - 댕글링 포인터 문제 해결
82. 주의사항!!
• - STL 컨테이너들과 같이 사용불가
• - 동적 배열에 사용불가
• - 힙 영역에 동적으로 할당된 메모리에만 적용 가능
83. SHADER_PTR
• - 소유권이 공유되는 방식으로 동작하는 스마트 포인터
•
• - 동일한 객체를 가리키는 스마트포인터의 개수를 센 후 개수가 0이 될때 객체
삭제
• (동일한 객체를 참조하는 모든 스마트 포인터가 자신의 scope를 벗어날때
• 공유객체의 소멸이 결정되는 방식)
• - STL 컨테이너에서 사용 가능( boost 라이브러리 설치 필수)
• - 강한 참조의 성격
• - 스레드에 안전함 ( 단 실행순서에는 영향을 받으므로 설계 중요!)
• - Thread Safety 해제 - 헤더파일에 "#define BOOST_DISABLE_THREADS "를 입력
84. 주의사항!!
• 순환 참조 사용하지 않을 것( 참조 카운트를 알수 없음)
•
• - 이름 없는 shared_ptr을 가능한 사용하지 말 것
• ( 이미 동적할당되어진 객체가 삭제되지 않아 메모리 릭 발생 가능)
•
• - 스마트포인터 생성시, 생성자를 직접호출하거나 명시적 형변환만 가능
• (암시적 형변환 지원 X)
•
• -원본 포인터(raw pointer)직접 삭제 불가.
• (reset(), 재할당 혹은 스마트포인터가 파괴될때 자동으로 원본 포인터가 삭제
되도록
• 작성할 것)
85. WEAK_PTR
• - shared_ptr에서 순환참조로 발생하는 문제를 해결하기 위해 사용하는 스마트
포인터
• - shared_ptr과 달리 객체에 대한 소유권을 가지지 않고 객체 사용
• - 약한 참조의 성질을 지님
• (객체가 살아있도록 유지 시키지 않고 단순히 객체가 살아 있는 동안 참조)
86. 주의사항
• - 자신이 가리키는 객체가 실제로 살아 있는지 체크 할수 없으므로, 댕글링 포
인터가 될 수있음
• ( 따라서 lock 함수를 사용하여 shared_ptr을 얻어올때 반드시 리턴값이 NULL(0)
인지 체크)
87. INTRUSIVE_PTR
• - 참조 개수를 스마트포인터 안에 두지 않고, 관리할 클래스 안에 보관하는 방
식의 스마트포인터
•
• - intrusive_ptr은 shared_ptr과 마찬가지로 참조 카운팅 방식으로 객체의 소멸 시
점을 결정
• (단, intrusive_ptr의 경우 관리될 객체가 스스로 자신의 내부에 참조개수를 유지
관리하도록 요구함)
•
• - intrusive_ptr 인스터스가 새롭게 생성될때는 intrusive_ptr_add_ret() 함수를 자동
으로 호출하여 참조의 개수를 증가시키도록 요구하고, 반대로 intrusive_ptr인스
턴스가 삭제될때 intrusive_ptr_release()함수를 호출하여, 참조개수가 0일때 객체
를 삭제하도록 요청
• (intrusive_ptr_add_ref() 와 intrusive_ptr_release() 함수의 경우 사용자가 직접 구현
해야 하며
• 이때 함수의 인자로 객체의 포인터를 넘겨줌
•
88. 사용 이유?
• - 기존의 독자적으로 참조개수를 가지는 객체에 스마트포인터를 적용하기 위
해서 필요
• - shared_ptr에 비해 작은 메모리공간을 차지
• - 일반 포인터와 마찬가지로 포인터(T*) 형태로 대입 가능
89. SCOPED_PTR
• - 동적으로 할당된 객체의 포인터를 가지며, 유효범위를 벗어나 자신이 삭제
될때,
• 가리키는 객체를 자동으로 삭제하는 스마트포인터(가리키는 객체에 대한 삭
제를 자동으로 수행)
•
• - auto_ptr과 달리 가지는 포인터를 다른 변수에 복사하거나 할당 할 수 없으며
소유권도 이전불가
•
• - STL의 컨테이너의 항목으로 사용할 수 없음 (shared_ptr이 좋다)
91. 결론
• 그 외 다양한 라이브러리가 존재(www.boost.org 참조)
• 우리 엔진에서는 안씀 (부스트는 조낸 구리니까…)
• 앞으로도 계속 업데이트 된다는것 (현재 1.49버전까지 업데이트…)
• 나보다 똑똑한 분들이 했으므로 내가 만든거보단 가져다 쓰는게 좋음(단 확실
히 알고…)
• www.boost.org에 가면 문서 다 있으므로 참조하기 쉬움(영어 잘하면…)