SlideShare uma empresa Scribd logo
1 de 93
BOOST 파헤치기
 2012년 4월 14일
      카제키리 ( 이진우)
차례
•   Array
•   Any
•   Variant
•   Random
•   Function
•   Bind
•   Lambda
•   Dynamic_bitset
•   Optional
차례
•   Timer
•   Format
•   Lexical_cast
•   Foreach
•   Scoped_exit
•   Unordered_set,Map
•   스마트 포인터
•   결론
•   Q&A
BOOST::ARRAY
BOOST::ARRAY
•   STL 벡터에 준거하는 정수사이즈 배열의 랩퍼 컨테이너
•   배열이지만 STL 처럼 보임..
•   Size() 사용 가능
•   Vector<Type>으로도 가능하지만 배열이므로 사이즈가 가변
•   "reversible containers"나 "sequence"을 충족하지 않기에
•   컨테이너라고 단정지을 수 없다
BOOST::ANY
BOOST::ANY
•   다른 형의 하나의 값을 보관하는 컨테이너
•   어떤 형이라도 저장 가능한 동적형 변수
•   C#에 박싱, 언박싱과 비슷한 개념
•   안전하고 범용적이다
•   실패시 bad_cast 예외를 던진다
BOOST::ANY
BOOST::ANY
•   문자열에선 char* 가 아닌 string을 사용한다
•   내부는 Template으로 구현되어 있으며 넘겨진 오브젝트의 형에 따라
    클래스의 포인터에 의해 any 컨테이너 중에 보관한다라는 형태이다
BOOST::VARIANT
BOOST::VARIANT
•   C++에 Union
•   Which() 멤버함수로 어떤 타입이 들어있는지 알 수 있음
•   Boost::any와 비슷
•   Variant는 실체 형태가 실행시에 동적으로 변화는 일종의 다양한 형태도 생각
    할수 있기
    때문에 Visitor패턴을 구현할 때 상당히 편리하다
BOOST::VARIANT
BOOST::RANDOM
BOOST::RANDOM
•   표준 rand와는 다른 rand 함수를 제공
•   1. generator 생성(의사 난수 발생기)
•   2. 범위 설정 후 범위를 넘겨 난수 발생
•   3. seed값을 멤버함수로 값을 넘겨줌
•   4. 만들어준 generator와 범위를 boost::variate_generator로 전달
BOOST::RANDOM
•   #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;
•   }
BOOST::RANDOM
BOOST::FUNCTION
BOOST::FUNCTION
•   함수포인터 및 멤버함수, 함수 객체, bind에 의해 만들어진 함수객체등을 격납
    할 수 있는 객체
•   커맨드 패턴으로 활용 가능
•   Loki 라이브러리에 Functor 클래스와 유사 (대안)
•   주로 Boost::binder와 조합하여 사용
BOOST::FUNCTION
BOOST.FUNCTION > FUNCTION POINTER
•   Boost.Function 은 임의 호환성이 잇는 함수 오브젝트를 저장 가능하다.
    (함수포인터는 완전 같은 시그니쳐를 가진 함수 밖에 받아 들이지 않는다).


•   Boost.Function은 인수의 구속등의 함수 오브젝트를 만들어 내는 라이브러리와
    공용 할 수 있다.


•   Boost::Function을 사용하면 빈 함수 오브젝트를 호출 할 때에
    그 일이 알 수 있도록 동작 한다.
FUNCTION POINTER > BOOST.FUNCTION
•   함수 포인터는 사이즈가 작다.
    ( 함수 포인터는 포인터 1개, Boost.Function은 포인터 3개) .


•   함수포인터는 빠르다
    (Boost.Function 는 함수 포인터를 통한 호출을 2회 할 가능성이 있다).


•   함수 포인터는 C의 라이브러리와 하위 호환성이 있다.
•   에러 메시지가 읽기 쉽다.
BOOST::BIND
BOOST::BIND
•   C++ binder에 강화판
•   Binary 뿐만 아니라 3항 4항도 가능
•   Mem_fun 사용 안해도 됨
    (내부에서 boost::mem_fn으로 바인드 측에서 처리)
BOOST::BIND
BOOST::LAMBDA
BOOST::LAMBDA
•   호출 시점에 이름 없는 함수 객체를 정의
•   필요한 키워드에 따른 h 파일 필요(람다형식의 키워드가 필요)
•   Placeholder라는 _1,_2,_3 형태로 매개변수를 대체
•   C++0x에서 이미 추가됨
풀이?
BOOST::POOL
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 인터페이스
SHARED_PTR ??
•   New delete를 하지 않아도 되는 것은 Shader_ptr도 마찬가지
BOOST::DYNAMIC_BITSET
BOOST::DYNAMIC_BITSET
•   Std::bitset에 동적 형태
•   사이즈를 런타임시 결정 가능
STL VS…
•   Std::bitset
•   템플릿 매개변수 -> 생성자 매개변수
•   사이즈가 컴파일시 고정 -> 런타임시 가능


•   Std::vector<bool>
•   비트집합 전체에 관하여 한번에 비트 연산 불가


•   Valarray
•   시프트 연산 불가
BOOST::OPTIONAL
BOOST::OPTIONAL
•   값을 리턴하는 함수에서 유효하지 않은 값을 리턴하기 위해 만들어짐
•   종전에는 std::pair<POD데이터 , bool>등으로 구현 (성능상 비효율..)
기존에는 포인터 사용??
•   void func( int p, struct hogehoge* ptr )
•   {
•   if( ptr )
•   *ptr = do_something( p );
•   else
•   do_something( p );
•   }
•
BOOST::TIMER PROGRESS_TIMER PROGRESS_DISPLAY
BOOST::TIMER
•   C의 clock()으로 구현되어 있는 timer
•   생성자나 restart를 부른 시점부터 경과시간을 전달
•   Clock()과 거의 마찬가지이나 뺄셈을 하는거보다 가독성과 빠른 코딩 가능
BOOST::PROGRESS_TIMER     PROGRESS_DISPLAY
•   변수 영역이 끝나는 시점에 소멸자로부터 불려지게 하는 방식의 Timer
•   함수의 return, break, 예외처리등 상관없이 불려지므로(자동처리 소멸자에서
    처리 하면 깔끔)
    (ex : auto_ptr)
•   (모래시계 만들기..멀티스레드용 크리티컬섹션의 Lock/Unlock처리)등에 유용


progress_display
•   ++연산 호출시 막대그래프가 갱신되는 형태
BOOST::FORMAT
BOOST::FORMAT
•   Iostream 형태의 스타일을 극복하기 위한 라이브러리
•   Iostream은 출력포맷지정이 귀찮으며 << 가 많을 경우 가독성 떨어짐
•   형식. 인자의 개수에 관해서 안전
•   새로 만든 형식이라도 확장이 가능
•   가변의 인수를 사용하지 않고 operator%를 받아 formatter측의 형식에서
    정보가 제대로 넘겨지게 하는 원리




•   즉.. 형식이 안전한 C++스타일의 printf같은 것
BOOST::LEXICAL_CAST
BOOST::LEXICAL_CAST
•   문자열과 수치의 상호 변환 Cast
•   std::stringstream에 << 로 흘려보내 >>로 꺼내는 방식
•   디폴트생성자/복사생성자/대입연산자가올바르게 구현되어있는 클래스 라면
    무엇이든 사용가능
BOOST::FOREACH
BOOST::FOREACH
•   컨테이너를 순차적으로 돌며 처리하는 루프 매크로(Range를 가진 것 대부분)
•   펑터를 만들어야 하는 귀찮음 제거
•   다중 루프, break, continue등 for,while에서 사용한거 가능
•   동적할당, 가상함수, 함수포인터 호출하지 않음
•   매크로 이므로 형태의 , <- 이런거 들어가면 에러
쉼표는 하면 안됨..
BOOST::SCOPE_EXIT
BOOST::SCOPE_EXIT
•   영역(Scope)내에 후처리를 쉽게 할 수 있도록 하는 라이브러리
•   예외 탈출, return, 정상완료 상관없이 가장 마지막에 호출
•   D 언어의 Scope(exit)
•   SAFE_DELETE 같은거 미리미리 넣어주기 등에 편리
BOOST::UNORDERED_MAP, UNORDERED_SET
BOOST::UNORDERED_MAP, UNORDERED_SET
•   해쉬를 사용한 O(1)로 요소액세스 가능한 set과 map (Std::map,set -> R-B 트리 사
    용)
•   고속으로 요소에 액세스 접근 가능
•   기존 std::set map과 완전 동일한 인터페이스
•   Gcc4 vc9 이전 환경에서는 사용 불가
좀더 빠르게..?
•    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;
•
스마트 포인터!!
AUTO_PTR
•   - 소유권 독점 방식으로 구동되는 스마트포인터, 복사시 소유권 이전되는 소
    유권 독점방식
•   - C++ 표준
•   - 소유권 이전 금지 - const 사용
•   (ex : const boost::auto_ptr<MyClass> aPtr(new MyClass);
•   - 자동으로 포인터에 할당된 메모리를 해제
•   - 자동으로 포인터 초기화 (디폴트 생성자)
•   - 댕글링 포인터 문제 해결
주의사항!!
•   - STL 컨테이너들과 같이 사용불가
•   - 동적 배열에 사용불가
•   - 힙 영역에 동적으로 할당된 메모리에만 적용 가능
SHADER_PTR
•   - 소유권이 공유되는 방식으로 동작하는 스마트 포인터
•
•   - 동일한 객체를 가리키는 스마트포인터의 개수를 센 후 개수가 0이 될때 객체
    삭제
•   (동일한 객체를 참조하는 모든 스마트 포인터가 자신의 scope를 벗어날때
•   공유객체의 소멸이 결정되는 방식)


•   - STL 컨테이너에서 사용 가능( boost 라이브러리 설치 필수)
•   - 강한 참조의 성격
•   - 스레드에 안전함 ( 단 실행순서에는 영향을 받으므로 설계 중요!)
•   - Thread Safety 해제 - 헤더파일에 "#define BOOST_DISABLE_THREADS "를 입력
주의사항!!
•   순환 참조 사용하지 않을 것( 참조 카운트를 알수 없음)
•
•   - 이름 없는 shared_ptr을 가능한 사용하지 말 것
•   ( 이미 동적할당되어진 객체가 삭제되지 않아 메모리 릭 발생 가능)
•
•   - 스마트포인터 생성시, 생성자를 직접호출하거나 명시적 형변환만 가능
•   (암시적 형변환 지원 X)
•
•   -원본 포인터(raw pointer)직접 삭제 불가.
•   (reset(), 재할당 혹은 스마트포인터가 파괴될때 자동으로 원본 포인터가 삭제
    되도록
•   작성할 것)
WEAK_PTR
•   - shared_ptr에서 순환참조로 발생하는 문제를 해결하기 위해 사용하는 스마트
    포인터
•   - shared_ptr과 달리 객체에 대한 소유권을 가지지 않고 객체 사용
•   - 약한 참조의 성질을 지님
•   (객체가 살아있도록 유지 시키지 않고 단순히 객체가 살아 있는 동안 참조)
주의사항
•   - 자신이 가리키는 객체가 실제로 살아 있는지 체크 할수 없으므로, 댕글링 포
    인터가 될 수있음
•   ( 따라서 lock 함수를 사용하여 shared_ptr을 얻어올때 반드시 리턴값이 NULL(0)
    인지 체크)
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() 함수의 경우 사용자가 직접 구현
    해야 하며
•   이때 함수의 인자로 객체의 포인터를 넘겨줌
•
사용 이유?
•   - 기존의 독자적으로 참조개수를 가지는 객체에 스마트포인터를 적용하기 위
    해서 필요
•   - shared_ptr에 비해 작은 메모리공간을 차지
•   - 일반 포인터와 마찬가지로 포인터(T*) 형태로 대입 가능
SCOPED_PTR
•   - 동적으로 할당된 객체의 포인터를 가지며, 유효범위를 벗어나 자신이 삭제
    될때,
•   가리키는 객체를 자동으로 삭제하는 스마트포인터(가리키는 객체에 대한 삭
    제를 자동으로 수행)
•
•   - auto_ptr과 달리 가지는 포인터를 다른 변수에 복사하거나 할당 할 수 없으며
    소유권도 이전불가
•
•   - STL의 컨테이너의 항목으로 사용할 수 없음 (shared_ptr이 좋다)
그 외..
•   Shared_array…
•   Scoped_array..
결론
•   그 외 다양한 라이브러리가 존재(www.boost.org 참조)
•   우리 엔진에서는 안씀 (부스트는 조낸 구리니까…)
•   앞으로도 계속 업데이트 된다는것 (현재 1.49버전까지 업데이트…)
•   나보다 똑똑한 분들이 했으므로 내가 만든거보단 가져다 쓰는게 좋음(단 확실
    히 알고…)
•   www.boost.org에 가면 문서 다 있으므로 참조하기 쉬움(영어 잘하면…)
Q&A




      물어보면 마봉파 시전하겠
      음…
Reference
•   http://www.boost.org/
•   http://www.kmonos.net/alang/boost/
•   C++ Standard Library
•   Cafe.naver.com/devrookie
•   Effective STL
•   그 외-..- 조낸 구글링

Mais conteúdo relacionado

Mais procurados

[C++ Korea 2nd Seminar] C++17 Key Features Summary
[C++ Korea 2nd Seminar] C++17 Key Features Summary[C++ Korea 2nd Seminar] C++17 Key Features Summary
[C++ Korea 2nd Seminar] C++17 Key Features SummaryChris Ohk
 
[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로
[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로
[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로Jaeseung Ha
 
Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심흥배 최
 
파이썬 스터디 15장
파이썬 스터디 15장파이썬 스터디 15장
파이썬 스터디 15장SeongHyun Ahn
 
파이썬 스터디 9장
파이썬 스터디 9장파이썬 스터디 9장
파이썬 스터디 9장SeongHyun Ahn
 
Javascript개발자의 눈으로 python 들여다보기
Javascript개발자의 눈으로 python 들여다보기Javascript개발자의 눈으로 python 들여다보기
Javascript개발자의 눈으로 python 들여다보기지수 윤
 
C#을 사용한 빠른 툴 개발
C#을 사용한 빠른 툴 개발C#을 사용한 빠른 툴 개발
C#을 사용한 빠른 툴 개발흥배 최
 
20150212 c++11 features used in crow
20150212 c++11 features used in crow20150212 c++11 features used in crow
20150212 c++11 features used in crowJaeseung Ha
 
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)Sang Don Kim
 
GopherCon Korea 2015 - Python 개발자를 위한 Go (이경찬)
GopherCon Korea 2015 - Python 개발자를 위한 Go (이경찬)GopherCon Korea 2015 - Python 개발자를 위한 Go (이경찬)
GopherCon Korea 2015 - Python 개발자를 위한 Go (이경찬)Kyoungchan Lee
 
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013사례를 통해 살펴보는 프로파일링과 최적화 NDC2013
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013Esun Kim
 
프로그래밍 대회: C++11 이야기
프로그래밍 대회: C++11 이야기프로그래밍 대회: C++11 이야기
프로그래밍 대회: C++11 이야기Jongwook Choi
 
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기Chris Ohk
 
2013 C++ Study For Students #1
2013 C++ Study For Students #12013 C++ Study For Students #1
2013 C++ Study For Students #1Chris Ohk
 
C++정리 스마트포인터
C++정리 스마트포인터C++정리 스마트포인터
C++정리 스마트포인터fefe7270
 
니름: 쉬운 SOA 단위 테스트
니름: 쉬운 SOA 단위 테스트니름: 쉬운 SOA 단위 테스트
니름: 쉬운 SOA 단위 테스트효준 강
 
Nexon Developers Conference 2017 Functional Programming for better code - Mod...
Nexon Developers Conference 2017 Functional Programming for better code - Mod...Nexon Developers Conference 2017 Functional Programming for better code - Mod...
Nexon Developers Conference 2017 Functional Programming for better code - Mod...Isaac Jeon
 
Python 활용: 이미지 처리와 데이터 분석
Python 활용: 이미지 처리와 데이터 분석Python 활용: 이미지 처리와 데이터 분석
Python 활용: 이미지 처리와 데이터 분석용 최
 

Mais procurados (20)

[C++ Korea 2nd Seminar] C++17 Key Features Summary
[C++ Korea 2nd Seminar] C++17 Key Features Summary[C++ Korea 2nd Seminar] C++17 Key Features Summary
[C++ Korea 2nd Seminar] C++17 Key Features Summary
 
[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로
[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로
[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로
 
Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심
 
파이썬 스터디 15장
파이썬 스터디 15장파이썬 스터디 15장
파이썬 스터디 15장
 
파이썬 스터디 9장
파이썬 스터디 9장파이썬 스터디 9장
파이썬 스터디 9장
 
Javascript개발자의 눈으로 python 들여다보기
Javascript개발자의 눈으로 python 들여다보기Javascript개발자의 눈으로 python 들여다보기
Javascript개발자의 눈으로 python 들여다보기
 
C#을 사용한 빠른 툴 개발
C#을 사용한 빠른 툴 개발C#을 사용한 빠른 툴 개발
C#을 사용한 빠른 툴 개발
 
20150212 c++11 features used in crow
20150212 c++11 features used in crow20150212 c++11 features used in crow
20150212 c++11 features used in crow
 
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
 
GopherCon Korea 2015 - Python 개발자를 위한 Go (이경찬)
GopherCon Korea 2015 - Python 개발자를 위한 Go (이경찬)GopherCon Korea 2015 - Python 개발자를 위한 Go (이경찬)
GopherCon Korea 2015 - Python 개발자를 위한 Go (이경찬)
 
요즘웹개발
요즘웹개발요즘웹개발
요즘웹개발
 
파이선 실전공략-1
파이선 실전공략-1파이선 실전공략-1
파이선 실전공략-1
 
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013사례를 통해 살펴보는 프로파일링과 최적화 NDC2013
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013
 
프로그래밍 대회: C++11 이야기
프로그래밍 대회: C++11 이야기프로그래밍 대회: C++11 이야기
프로그래밍 대회: C++11 이야기
 
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
 
2013 C++ Study For Students #1
2013 C++ Study For Students #12013 C++ Study For Students #1
2013 C++ Study For Students #1
 
C++정리 스마트포인터
C++정리 스마트포인터C++정리 스마트포인터
C++정리 스마트포인터
 
니름: 쉬운 SOA 단위 테스트
니름: 쉬운 SOA 단위 테스트니름: 쉬운 SOA 단위 테스트
니름: 쉬운 SOA 단위 테스트
 
Nexon Developers Conference 2017 Functional Programming for better code - Mod...
Nexon Developers Conference 2017 Functional Programming for better code - Mod...Nexon Developers Conference 2017 Functional Programming for better code - Mod...
Nexon Developers Conference 2017 Functional Programming for better code - Mod...
 
Python 활용: 이미지 처리와 데이터 분석
Python 활용: 이미지 처리와 데이터 분석Python 활용: 이미지 처리와 데이터 분석
Python 활용: 이미지 처리와 데이터 분석
 

Semelhante a Boost

Effective C++ Chaper 1
Effective C++ Chaper 1Effective C++ Chaper 1
Effective C++ Chaper 1연우 김
 
Effective c++ chapter1 2_dcshin
Effective c++ chapter1 2_dcshinEffective c++ chapter1 2_dcshin
Effective c++ chapter1 2_dcshinDong Chan Shin
 
More effective c++ chapter1,2
More effective c++ chapter1,2More effective c++ chapter1,2
More effective c++ chapter1,2문익 장
 
NHNNEXT 개경프14 Subway Rocket Team Study 3rd C++
NHNNEXT 개경프14 Subway Rocket Team Study 3rd C++NHNNEXT 개경프14 Subway Rocket Team Study 3rd C++
NHNNEXT 개경프14 Subway Rocket Team Study 3rd C++Min-soo Park
 
Let's Go (golang)
Let's Go (golang)Let's Go (golang)
Let's Go (golang)상욱 송
 
effective c++ chapter 3~4 정리
effective c++ chapter 3~4 정리effective c++ chapter 3~4 정리
effective c++ chapter 3~4 정리Injae Lee
 
More effective c++ 3주차
More effective c++ 3주차More effective c++ 3주차
More effective c++ 3주차Injae Lee
 
Effective modern cpp item18, 19
Effective modern cpp item18, 19Effective modern cpp item18, 19
Effective modern cpp item18, 19진화 손
 
Ec++ 3,4 summary
Ec++ 3,4 summaryEc++ 3,4 summary
Ec++ 3,4 summarySehyeon Nam
 
Concurrency in action - chapter 7
Concurrency in action - chapter 7Concurrency in action - chapter 7
Concurrency in action - chapter 7JinWoo Lee
 
Effective c++ 정리 chapter 4
Effective c++ 정리 chapter 4Effective c++ 정리 chapter 4
Effective c++ 정리 chapter 4연우 김
 
C++ Advanced 강의 4주차
 C++ Advanced 강의 4주차 C++ Advanced 강의 4주차
C++ Advanced 강의 4주차HyunJoon Park
 
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화sung ki choi
 
Effective c++ chapter 7,8
Effective c++ chapter 7,8Effective c++ chapter 7,8
Effective c++ chapter 7,8문익 장
 
Python 생태계의 이해
Python 생태계의 이해Python 생태계의 이해
Python 생태계의 이해용 최
 
C++ Advanced 강의 1주차
C++ Advanced 강의 1주차C++ Advanced 강의 1주차
C++ Advanced 강의 1주차HyunJoon Park
 
모어 이펙티브 c++ 5장 스터디
모어 이펙티브 c++ 5장 스터디모어 이펙티브 c++ 5장 스터디
모어 이펙티브 c++ 5장 스터디quxn6
 
More effective c++ 2
More effective c++ 2More effective c++ 2
More effective c++ 2현찬 양
 
More effective c++ 3
More effective c++ 3More effective c++ 3
More effective c++ 3현찬 양
 

Semelhante a Boost (20)

Effective C++ Chaper 1
Effective C++ Chaper 1Effective C++ Chaper 1
Effective C++ Chaper 1
 
Effective c++ chapter1 2_dcshin
Effective c++ chapter1 2_dcshinEffective c++ chapter1 2_dcshin
Effective c++ chapter1 2_dcshin
 
More effective c++ chapter1,2
More effective c++ chapter1,2More effective c++ chapter1,2
More effective c++ chapter1,2
 
NHNNEXT 개경프14 Subway Rocket Team Study 3rd C++
NHNNEXT 개경프14 Subway Rocket Team Study 3rd C++NHNNEXT 개경프14 Subway Rocket Team Study 3rd C++
NHNNEXT 개경프14 Subway Rocket Team Study 3rd C++
 
Let's Go (golang)
Let's Go (golang)Let's Go (golang)
Let's Go (golang)
 
effective c++ chapter 3~4 정리
effective c++ chapter 3~4 정리effective c++ chapter 3~4 정리
effective c++ chapter 3~4 정리
 
More effective c++ 3주차
More effective c++ 3주차More effective c++ 3주차
More effective c++ 3주차
 
Effective modern cpp item18, 19
Effective modern cpp item18, 19Effective modern cpp item18, 19
Effective modern cpp item18, 19
 
Ec++ 3,4 summary
Ec++ 3,4 summaryEc++ 3,4 summary
Ec++ 3,4 summary
 
Concurrency in action - chapter 7
Concurrency in action - chapter 7Concurrency in action - chapter 7
Concurrency in action - chapter 7
 
Effective c++ 정리 chapter 4
Effective c++ 정리 chapter 4Effective c++ 정리 chapter 4
Effective c++ 정리 chapter 4
 
C++ Advanced 강의 4주차
 C++ Advanced 강의 4주차 C++ Advanced 강의 4주차
C++ Advanced 강의 4주차
 
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
 
Effective c++ chapter 7,8
Effective c++ chapter 7,8Effective c++ chapter 7,8
Effective c++ chapter 7,8
 
Python 생태계의 이해
Python 생태계의 이해Python 생태계의 이해
Python 생태계의 이해
 
C++ Advanced 강의 1주차
C++ Advanced 강의 1주차C++ Advanced 강의 1주차
C++ Advanced 강의 1주차
 
모어 이펙티브 c++ 5장 스터디
모어 이펙티브 c++ 5장 스터디모어 이펙티브 c++ 5장 스터디
모어 이펙티브 c++ 5장 스터디
 
More effective c++ 2
More effective c++ 2More effective c++ 2
More effective c++ 2
 
More effective c++ 3
More effective c++ 3More effective c++ 3
More effective c++ 3
 
Git
GitGit
Git
 

Boost

  • 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
  • 5. BOOST::ARRAY • STL 벡터에 준거하는 정수사이즈 배열의 랩퍼 컨테이너 • 배열이지만 STL 처럼 보임.. • Size() 사용 가능 • Vector<Type>으로도 가능하지만 배열이므로 사이즈가 가변 • "reversible containers"나 "sequence"을 충족하지 않기에 • 컨테이너라고 단정지을 수 없다
  • 6.
  • 7.
  • 9. BOOST::ANY • 다른 형의 하나의 값을 보관하는 컨테이너 • 어떤 형이라도 저장 가능한 동적형 변수 • C#에 박싱, 언박싱과 비슷한 개념 • 안전하고 범용적이다 • 실패시 bad_cast 예외를 던진다
  • 10.
  • 12. BOOST::ANY • 문자열에선 char* 가 아닌 string을 사용한다 • 내부는 Template으로 구현되어 있으며 넘겨진 오브젝트의 형에 따라 클래스의 포인터에 의해 any 컨테이너 중에 보관한다라는 형태이다
  • 14. BOOST::VARIANT • C++에 Union • Which() 멤버함수로 어떤 타입이 들어있는지 알 수 있음 • Boost::any와 비슷 • Variant는 실체 형태가 실행시에 동적으로 변화는 일종의 다양한 형태도 생각 할수 있기 때문에 Visitor패턴을 구현할 때 상당히 편리하다
  • 15.
  • 18. BOOST::RANDOM • 표준 rand와는 다른 rand 함수를 제공 • 1. generator 생성(의사 난수 발생기) • 2. 범위 설정 후 범위를 넘겨 난수 발생 • 3. seed값을 멤버함수로 값을 넘겨줌 • 4. 만들어준 generator와 범위를 boost::variate_generator로 전달
  • 20. #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; • }
  • 23. BOOST::FUNCTION • 함수포인터 및 멤버함수, 함수 객체, bind에 의해 만들어진 함수객체등을 격납 할 수 있는 객체 • 커맨드 패턴으로 활용 가능 • Loki 라이브러리에 Functor 클래스와 유사 (대안) • 주로 Boost::binder와 조합하여 사용
  • 24.
  • 26. BOOST.FUNCTION > FUNCTION POINTER • Boost.Function 은 임의 호환성이 잇는 함수 오브젝트를 저장 가능하다. (함수포인터는 완전 같은 시그니쳐를 가진 함수 밖에 받아 들이지 않는다). • Boost.Function은 인수의 구속등의 함수 오브젝트를 만들어 내는 라이브러리와 공용 할 수 있다. • Boost::Function을 사용하면 빈 함수 오브젝트를 호출 할 때에 그 일이 알 수 있도록 동작 한다.
  • 27. FUNCTION POINTER > BOOST.FUNCTION • 함수 포인터는 사이즈가 작다. ( 함수 포인터는 포인터 1개, Boost.Function은 포인터 3개) . • 함수포인터는 빠르다 (Boost.Function 는 함수 포인터를 통한 호출을 2회 할 가능성이 있다). • 함수 포인터는 C의 라이브러리와 하위 호환성이 있다. • 에러 메시지가 읽기 쉽다.
  • 29. BOOST::BIND • C++ binder에 강화판 • Binary 뿐만 아니라 3항 4항도 가능 • Mem_fun 사용 안해도 됨 (내부에서 boost::mem_fn으로 바인드 측에서 처리)
  • 30.
  • 31.
  • 34. BOOST::LAMBDA • 호출 시점에 이름 없는 함수 객체를 정의 • 필요한 키워드에 따른 h 파일 필요(람다형식의 키워드가 필요) • Placeholder라는 _1,_2,_3 형태로 매개변수를 대체 • C++0x에서 이미 추가됨
  • 35.
  • 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 인터페이스
  • 39.
  • 40.
  • 41.
  • 42. SHARED_PTR ?? • New delete를 하지 않아도 되는 것은 Shader_ptr도 마찬가지
  • 44. BOOST::DYNAMIC_BITSET • Std::bitset에 동적 형태 • 사이즈를 런타임시 결정 가능
  • 45. STL VS… • Std::bitset • 템플릿 매개변수 -> 생성자 매개변수 • 사이즈가 컴파일시 고정 -> 런타임시 가능 • Std::vector<bool> • 비트집합 전체에 관하여 한번에 비트 연산 불가 • Valarray • 시프트 연산 불가
  • 46.
  • 47.
  • 49. BOOST::OPTIONAL • 값을 리턴하는 함수에서 유효하지 않은 값을 리턴하기 위해 만들어짐 • 종전에는 std::pair<POD데이터 , bool>등으로 구현 (성능상 비효율..)
  • 50.
  • 51.
  • 52. 기존에는 포인터 사용?? • void func( int p, struct hogehoge* ptr ) • { • if( ptr ) • *ptr = do_something( p ); • else • do_something( p ); • } •
  • 54. BOOST::TIMER • C의 clock()으로 구현되어 있는 timer • 생성자나 restart를 부른 시점부터 경과시간을 전달 • Clock()과 거의 마찬가지이나 뺄셈을 하는거보다 가독성과 빠른 코딩 가능
  • 55. BOOST::PROGRESS_TIMER PROGRESS_DISPLAY • 변수 영역이 끝나는 시점에 소멸자로부터 불려지게 하는 방식의 Timer • 함수의 return, break, 예외처리등 상관없이 불려지므로(자동처리 소멸자에서 처리 하면 깔끔) (ex : auto_ptr) • (모래시계 만들기..멀티스레드용 크리티컬섹션의 Lock/Unlock처리)등에 유용 progress_display • ++연산 호출시 막대그래프가 갱신되는 형태
  • 56.
  • 57.
  • 59. BOOST::FORMAT • Iostream 형태의 스타일을 극복하기 위한 라이브러리 • Iostream은 출력포맷지정이 귀찮으며 << 가 많을 경우 가독성 떨어짐 • 형식. 인자의 개수에 관해서 안전 • 새로 만든 형식이라도 확장이 가능 • 가변의 인수를 사용하지 않고 operator%를 받아 formatter측의 형식에서 정보가 제대로 넘겨지게 하는 원리 • 즉.. 형식이 안전한 C++스타일의 printf같은 것
  • 60.
  • 61.
  • 63. BOOST::LEXICAL_CAST • 문자열과 수치의 상호 변환 Cast • std::stringstream에 << 로 흘려보내 >>로 꺼내는 방식 • 디폴트생성자/복사생성자/대입연산자가올바르게 구현되어있는 클래스 라면 무엇이든 사용가능
  • 64.
  • 65.
  • 67. BOOST::FOREACH • 컨테이너를 순차적으로 돌며 처리하는 루프 매크로(Range를 가진 것 대부분) • 펑터를 만들어야 하는 귀찮음 제거 • 다중 루프, break, continue등 for,while에서 사용한거 가능 • 동적할당, 가상함수, 함수포인터 호출하지 않음 • 매크로 이므로 형태의 , <- 이런거 들어가면 에러
  • 68.
  • 69.
  • 72. BOOST::SCOPE_EXIT • 영역(Scope)내에 후처리를 쉽게 할 수 있도록 하는 라이브러리 • 예외 탈출, return, 정상완료 상관없이 가장 마지막에 호출 • D 언어의 Scope(exit) • SAFE_DELETE 같은거 미리미리 넣어주기 등에 편리
  • 73.
  • 74.
  • 76. BOOST::UNORDERED_MAP, UNORDERED_SET • 해쉬를 사용한 O(1)로 요소액세스 가능한 set과 map (Std::map,set -> R-B 트리 사 용) • 고속으로 요소에 액세스 접근 가능 • 기존 std::set map과 완전 동일한 인터페이스 • Gcc4 vc9 이전 환경에서는 사용 불가
  • 77.
  • 78.
  • 79. 좀더 빠르게..? • 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; •
  • 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이 좋다)
  • 90. 그 외.. • Shared_array… • Scoped_array..
  • 91. 결론 • 그 외 다양한 라이브러리가 존재(www.boost.org 참조) • 우리 엔진에서는 안씀 (부스트는 조낸 구리니까…) • 앞으로도 계속 업데이트 된다는것 (현재 1.49버전까지 업데이트…) • 나보다 똑똑한 분들이 했으므로 내가 만든거보단 가져다 쓰는게 좋음(단 확실 히 알고…) • www.boost.org에 가면 문서 다 있으므로 참조하기 쉬움(영어 잘하면…)
  • 92. Q&A 물어보면 마봉파 시전하겠 음…
  • 93. Reference • http://www.boost.org/ • http://www.kmonos.net/alang/boost/ • C++ Standard Library • Cafe.naver.com/devrookie • Effective STL • 그 외-..- 조낸 구글링