Boost

  • 1,663 views
Uploaded on

devrookie boost

devrookie boost

More in: Education
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
1,663
On Slideshare
0
From Embeds
0
Number of Embeds
1

Actions

Shares
Downloads
35
Comments
0
Likes
4

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. BOOST 파헤치기 2012년 4월 14일 카제키리 ( 이진우)
  • 2. 차례• Array• Any• Variant• Random• Function• Bind• Lambda• Dynamic_bitset• Optional
  • 3. 차례• Timer• Format• Lexical_cast• Foreach• Scoped_exit• Unordered_set,Map• 스마트 포인터• 결론• Q&A
  • 4. BOOST::ARRAY
  • 5. BOOST::ARRAY• STL 벡터에 준거하는 정수사이즈 배열의 랩퍼 컨테이너• 배열이지만 STL 처럼 보임..• Size() 사용 가능• Vector<Type>으로도 가능하지만 배열이므로 사이즈가 가변• "reversible containers"나 "sequence"을 충족하지 않기에• 컨테이너라고 단정지을 수 없다
  • 6. BOOST::ANY
  • 7. BOOST::ANY• 다른 형의 하나의 값을 보관하는 컨테이너• 어떤 형이라도 저장 가능한 동적형 변수• C#에 박싱, 언박싱과 비슷한 개념• 안전하고 범용적이다• 실패시 bad_cast 예외를 던진다
  • 8. BOOST::ANY
  • 9. BOOST::ANY• 문자열에선 char* 가 아닌 string을 사용한다• 내부는 Template으로 구현되어 있으며 넘겨진 오브젝트의 형에 따라 클래스의 포인터에 의해 any 컨테이너 중에 보관한다라는 형태이다
  • 10. BOOST::VARIANT
  • 11. BOOST::VARIANT• C++에 Union• Which() 멤버함수로 어떤 타입이 들어있는지 알 수 있음• Boost::any와 비슷• Variant는 실체 형태가 실행시에 동적으로 변화는 일종의 다양한 형태도 생각 할수 있기 때문에 Visitor패턴을 구현할 때 상당히 편리하다
  • 12. BOOST::VARIANT
  • 13. BOOST::RANDOM
  • 14. BOOST::RANDOM• 표준 rand와는 다른 rand 함수를 제공• 1. generator 생성(의사 난수 발생기)• 2. 범위 설정 후 범위를 넘겨 난수 발생• 3. seed값을 멤버함수로 값을 넘겨줌• 4. 만들어준 generator와 범위를 boost::variate_generator로 전달
  • 15. BOOST::RANDOM
  • 16. • #include <iostream>• #include <boost/random.hpp>• using namespace std;• using namespace boost;•• int main()• {• // -3이상4이하의 정수를 랜덤하게 생성하는 의사난수계열 작성• mt19937 gen;• uniform_int<> dst( -3, 4 );• variate_generator<mt19937, uniform_int<> > rand( gen, dst );•• // 20개 출력• for( int i=0; i!=20; ++i )• cout << rand() << ;• return 0;• }
  • 17. BOOST::RANDOM
  • 18. BOOST::FUNCTION
  • 19. BOOST::FUNCTION• 함수포인터 및 멤버함수, 함수 객체, bind에 의해 만들어진 함수객체등을 격납 할 수 있는 객체• 커맨드 패턴으로 활용 가능• Loki 라이브러리에 Functor 클래스와 유사 (대안)• 주로 Boost::binder와 조합하여 사용
  • 20. BOOST::FUNCTION
  • 21. BOOST.FUNCTION > FUNCTION POINTER• Boost.Function 은 임의 호환성이 잇는 함수 오브젝트를 저장 가능하다. (함수포인터는 완전 같은 시그니쳐를 가진 함수 밖에 받아 들이지 않는다).• Boost.Function은 인수의 구속등의 함수 오브젝트를 만들어 내는 라이브러리와 공용 할 수 있다.• Boost::Function을 사용하면 빈 함수 오브젝트를 호출 할 때에 그 일이 알 수 있도록 동작 한다.
  • 22. FUNCTION POINTER > BOOST.FUNCTION• 함수 포인터는 사이즈가 작다. ( 함수 포인터는 포인터 1개, Boost.Function은 포인터 3개) .• 함수포인터는 빠르다 (Boost.Function 는 함수 포인터를 통한 호출을 2회 할 가능성이 있다).• 함수 포인터는 C의 라이브러리와 하위 호환성이 있다.• 에러 메시지가 읽기 쉽다.
  • 23. BOOST::BIND
  • 24. BOOST::BIND• C++ binder에 강화판• Binary 뿐만 아니라 3항 4항도 가능• Mem_fun 사용 안해도 됨 (내부에서 boost::mem_fn으로 바인드 측에서 처리)
  • 25. BOOST::BIND
  • 26. BOOST::LAMBDA
  • 27. BOOST::LAMBDA• 호출 시점에 이름 없는 함수 객체를 정의• 필요한 키워드에 따른 h 파일 필요(람다형식의 키워드가 필요)• Placeholder라는 _1,_2,_3 형태로 매개변수를 대체• C++0x에서 이미 추가됨
  • 28. 풀이?
  • 29. BOOST::POOL
  • 30. 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 인터페이스
  • 31. SHARED_PTR ??• New delete를 하지 않아도 되는 것은 Shader_ptr도 마찬가지
  • 32. BOOST::DYNAMIC_BITSET
  • 33. BOOST::DYNAMIC_BITSET• Std::bitset에 동적 형태• 사이즈를 런타임시 결정 가능
  • 34. STL VS…• Std::bitset• 템플릿 매개변수 -> 생성자 매개변수• 사이즈가 컴파일시 고정 -> 런타임시 가능• Std::vector<bool>• 비트집합 전체에 관하여 한번에 비트 연산 불가• Valarray• 시프트 연산 불가
  • 35. BOOST::OPTIONAL
  • 36. BOOST::OPTIONAL• 값을 리턴하는 함수에서 유효하지 않은 값을 리턴하기 위해 만들어짐• 종전에는 std::pair<POD데이터 , bool>등으로 구현 (성능상 비효율..)
  • 37. 기존에는 포인터 사용??• void func( int p, struct hogehoge* ptr )• {• if( ptr )• *ptr = do_something( p );• else• do_something( p );• }•
  • 38. BOOST::TIMER PROGRESS_TIMER PROGRESS_DISPLAY
  • 39. BOOST::TIMER• C의 clock()으로 구현되어 있는 timer• 생성자나 restart를 부른 시점부터 경과시간을 전달• Clock()과 거의 마찬가지이나 뺄셈을 하는거보다 가독성과 빠른 코딩 가능
  • 40. BOOST::PROGRESS_TIMER PROGRESS_DISPLAY• 변수 영역이 끝나는 시점에 소멸자로부터 불려지게 하는 방식의 Timer• 함수의 return, break, 예외처리등 상관없이 불려지므로(자동처리 소멸자에서 처리 하면 깔끔) (ex : auto_ptr)• (모래시계 만들기..멀티스레드용 크리티컬섹션의 Lock/Unlock처리)등에 유용progress_display• ++연산 호출시 막대그래프가 갱신되는 형태
  • 41. BOOST::FORMAT
  • 42. BOOST::FORMAT• Iostream 형태의 스타일을 극복하기 위한 라이브러리• Iostream은 출력포맷지정이 귀찮으며 << 가 많을 경우 가독성 떨어짐• 형식. 인자의 개수에 관해서 안전• 새로 만든 형식이라도 확장이 가능• 가변의 인수를 사용하지 않고 operator%를 받아 formatter측의 형식에서 정보가 제대로 넘겨지게 하는 원리• 즉.. 형식이 안전한 C++스타일의 printf같은 것
  • 43. BOOST::LEXICAL_CAST
  • 44. BOOST::LEXICAL_CAST• 문자열과 수치의 상호 변환 Cast• std::stringstream에 << 로 흘려보내 >>로 꺼내는 방식• 디폴트생성자/복사생성자/대입연산자가올바르게 구현되어있는 클래스 라면 무엇이든 사용가능
  • 45. BOOST::FOREACH
  • 46. BOOST::FOREACH• 컨테이너를 순차적으로 돌며 처리하는 루프 매크로(Range를 가진 것 대부분)• 펑터를 만들어야 하는 귀찮음 제거• 다중 루프, break, continue등 for,while에서 사용한거 가능• 동적할당, 가상함수, 함수포인터 호출하지 않음• 매크로 이므로 형태의 , <- 이런거 들어가면 에러
  • 47. 쉼표는 하면 안됨..
  • 48. BOOST::SCOPE_EXIT
  • 49. BOOST::SCOPE_EXIT• 영역(Scope)내에 후처리를 쉽게 할 수 있도록 하는 라이브러리• 예외 탈출, return, 정상완료 상관없이 가장 마지막에 호출• D 언어의 Scope(exit)• SAFE_DELETE 같은거 미리미리 넣어주기 등에 편리
  • 50. BOOST::UNORDERED_MAP, UNORDERED_SET
  • 51. BOOST::UNORDERED_MAP, UNORDERED_SET• 해쉬를 사용한 O(1)로 요소액세스 가능한 set과 map (Std::map,set -> R-B 트리 사 용)• 고속으로 요소에 액세스 접근 가능• 기존 std::set map과 완전 동일한 인터페이스• Gcc4 vc9 이전 환경에서는 사용 불가
  • 52. 좀더 빠르게..?• typedef boost::unordered_set<int, boost::hash<int>, std::equal_to<int>, boost::fast_pool_allocator<int, boost::default_user_allocator_new_delete, boost::d etails::pool::null_mutex> > BOOST_POOL_SET;•
  • 53. 스마트 포인터!!
  • 54. AUTO_PTR• - 소유권 독점 방식으로 구동되는 스마트포인터, 복사시 소유권 이전되는 소 유권 독점방식• - C++ 표준• - 소유권 이전 금지 - const 사용• (ex : const boost::auto_ptr<MyClass> aPtr(new MyClass);• - 자동으로 포인터에 할당된 메모리를 해제• - 자동으로 포인터 초기화 (디폴트 생성자)• - 댕글링 포인터 문제 해결
  • 55. 주의사항!!• - STL 컨테이너들과 같이 사용불가• - 동적 배열에 사용불가• - 힙 영역에 동적으로 할당된 메모리에만 적용 가능
  • 56. SHADER_PTR• - 소유권이 공유되는 방식으로 동작하는 스마트 포인터•• - 동일한 객체를 가리키는 스마트포인터의 개수를 센 후 개수가 0이 될때 객체 삭제• (동일한 객체를 참조하는 모든 스마트 포인터가 자신의 scope를 벗어날때• 공유객체의 소멸이 결정되는 방식)• - STL 컨테이너에서 사용 가능( boost 라이브러리 설치 필수)• - 강한 참조의 성격• - 스레드에 안전함 ( 단 실행순서에는 영향을 받으므로 설계 중요!)• - Thread Safety 해제 - 헤더파일에 "#define BOOST_DISABLE_THREADS "를 입력
  • 57. 주의사항!!• 순환 참조 사용하지 않을 것( 참조 카운트를 알수 없음)•• - 이름 없는 shared_ptr을 가능한 사용하지 말 것• ( 이미 동적할당되어진 객체가 삭제되지 않아 메모리 릭 발생 가능)•• - 스마트포인터 생성시, 생성자를 직접호출하거나 명시적 형변환만 가능• (암시적 형변환 지원 X)•• -원본 포인터(raw pointer)직접 삭제 불가.• (reset(), 재할당 혹은 스마트포인터가 파괴될때 자동으로 원본 포인터가 삭제 되도록• 작성할 것)
  • 58. WEAK_PTR• - shared_ptr에서 순환참조로 발생하는 문제를 해결하기 위해 사용하는 스마트 포인터• - shared_ptr과 달리 객체에 대한 소유권을 가지지 않고 객체 사용• - 약한 참조의 성질을 지님• (객체가 살아있도록 유지 시키지 않고 단순히 객체가 살아 있는 동안 참조)
  • 59. 주의사항• - 자신이 가리키는 객체가 실제로 살아 있는지 체크 할수 없으므로, 댕글링 포 인터가 될 수있음• ( 따라서 lock 함수를 사용하여 shared_ptr을 얻어올때 반드시 리턴값이 NULL(0) 인지 체크)
  • 60. 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() 함수의 경우 사용자가 직접 구현 해야 하며• 이때 함수의 인자로 객체의 포인터를 넘겨줌•
  • 61. 사용 이유?• - 기존의 독자적으로 참조개수를 가지는 객체에 스마트포인터를 적용하기 위 해서 필요• - shared_ptr에 비해 작은 메모리공간을 차지• - 일반 포인터와 마찬가지로 포인터(T*) 형태로 대입 가능
  • 62. SCOPED_PTR• - 동적으로 할당된 객체의 포인터를 가지며, 유효범위를 벗어나 자신이 삭제 될때,• 가리키는 객체를 자동으로 삭제하는 스마트포인터(가리키는 객체에 대한 삭 제를 자동으로 수행)•• - auto_ptr과 달리 가지는 포인터를 다른 변수에 복사하거나 할당 할 수 없으며 소유권도 이전불가•• - STL의 컨테이너의 항목으로 사용할 수 없음 (shared_ptr이 좋다)
  • 63. 그 외..• Shared_array…• Scoped_array..
  • 64. 결론• 그 외 다양한 라이브러리가 존재(www.boost.org 참조)• 우리 엔진에서는 안씀 (부스트는 조낸 구리니까…)• 앞으로도 계속 업데이트 된다는것 (현재 1.49버전까지 업데이트…)• 나보다 똑똑한 분들이 했으므로 내가 만든거보단 가져다 쓰는게 좋음(단 확실 히 알고…)• www.boost.org에 가면 문서 다 있으므로 참조하기 쉬움(영어 잘하면…)
  • 65. Q&A 물어보면 마봉파 시전하겠 음…
  • 66. Reference• http://www.boost.org/• http://www.kmonos.net/alang/boost/• C++ Standard Library• Cafe.naver.com/devrookie• Effective STL• 그 외-..- 조낸 구글링