본문 바로가기

연구실/Boost.org

(7)
Boost.Foreach : 부스트 포이치, BOOST_FOREACH, 2부 1부에선 기본적인 개념을 정리했습니다. 2부에서는 BOOST_FOREACH를 보다 확장해서 사용하거나, 최적화 해서 사용 하는 방법에 대해서 알아 봅니다. BOOST_FOREACH 의 확장 BOOST_FOREACH 를 사용하다보면, 내가 정의한 새로운 타입의 집합체도 BOOST_FOREACH를 이용하여 훑고 싶을 때가 있습니다. 어떻게 하면 사용 할 수 있을까요? 여기서 말하는 확장은 바로 "새로운 타입을 BOOST_FOREACH"로 돌리기 위한 확장 입니다. 확장을 하는 방법으로 다음 코드를 보세요. 여기선 예로 std::string 이라고 정하는데, 원리는 똑같습니다. #include #include #include // for BOOST_FOREACH namespace my { // 시작과 끝을 나..
Boost.Foreach : 부스트 포이치, BOOST_FOREACH, 1부 BOOST_FOREACH 의 경우 boost 1.34.0 부터 정식으로 들어간 라이브러리 입니다. 본 문서는 boost 1.40.0 기준으로 작성 되었습니다. BOOST_FOREACH 에 대한 메뉴얼은 다음의 링크에서 확인 할 수 있습니다. http://www.boost.org/doc/libs/1_40_0/doc/html/foreach.html BOOST_FOREACH 란? C++ 에서 반복자로 정해진 구역을 기존의 방식보다 편하게 훑기 위해서 만들어진 라이브러리 입니다. 기존의 방식으로는 for 문, std::for_each 가 대표적인데, 사용방법이 귀찮거나, 소스관리가 어려운 단점이 있었기에, 사용 할 때 많은 신경을 써야 했습니다. 기존의 방법들의 단점을 한번 봐 봅시다. #include // f..
boost::scope exit, BOOST_SCOPE_EXIT 이번 boost 포스팅은 boost의 1.38.0 버전 부터 추가가 된 scope exit 입니다. 라이브러리 이름에서 오는 포스에서 알 수 있듯이, "유효 범위"와 관련 있는 라이브러리 입니다. http://www.boost.org/doc/libs/1_40_0/libs/scope_exit/doc/html/index.html 에서 확인 가능합니다만, 시간이 지나서 링크가 깨질수 있으니. boost.org 에 직접 들어 가봐서 보는게 좋을듯 싶네요. scope exit 란 무엇인가? "{ }" 를 벗어 날 경우, { } 안에 있는 변수들의 경우, 스택 되감기에 의하여, 지워 집니다. 이때 C++에서의 객체라면, 소멸자를 호출해주는데, 문제는 동적메모리 할당된 개체의 경우라든지, 뮤텍스라든지, 파일 핸들, ..
Boost.Bind - 파트 3 ( bind 성능 테스트 ) 바인드 성능 테스트 : update 2014.06.12 Bind는 언제 사용 해야 하는가? bind 자체는 성능 향상이 아닌, 생산성 향상을 위한 유틸리티라고 나는 생각한다. 왜냐하면 bind로 만든 콜백 등은 더 많은 수행 자원을 사용하기 때문이다. 60 frame 갱신 프로그램에서 10,000 객체가 각각 20번씩 호출 될 때, 초당 12,000,000번 호출 되는데, 바인딩 함수 호출만으로, 프레임 하락이 생긴다. 그러므로 이벤트 발생에 따른 콜백등에 사용하는게 제일 좋다. 테스트 환경 VS2012, Release이며, 결과는 32bit 실행 파일 테스트 코드 /* Boost Lib */ #include #include #include /* Stand Lib */ #include long long ..
Boost.Bind - 파트 2 (함수 오브젝트 bind 하기 ) Bind 는 임의의 함수 포인터나 함수에 국한되지 않고, 함수 객체도 bind 할 수 있게 해 준다. 이 함수 객체를 바인드 할 경우 operator() 의 리턴 타입을 명시적으로 bind 함수에 알려 줘야 한다. #include struct F { int operator()(int a, int b) { return a - b; } bool operator()(long a, long b) { return a == b; } }; int main( void ) { F f; int x = 104; bind(f, _1, _1)(x);// f(x, x), i.e. zero return 0; } 이 처럼 bind(...) 을 지정해 주어야 bind 함수는 객체를 생성 할 수 있게 된다. 여기서 유심히 봐야 할 부분..
boost.bind - 파트 1 어디에 쓰이는고 하면, 컨테이너의 객체들을 들 쑤시고 싶을 때, 함수 객체를 사용해야 할 때, 일일이 함수 객체를 만들어 주기 귀찮을 때, 주로 사용 된다. bind 는 std::bindlst 와 std::bind2nd를 보다 일반화 시킨 함수이다.. bind 는 임의의 함수, 함수 포인터, 함수 객체, 멤버 함수를 함수 객체로 만들 수 있으며, 원하는 위치에 원하는 값을 전달 시킬 수 있는 함수 객체를 만들어 준다. (요구 조건 또한 없다. 묶고 싶다면 bind 라고 외워도 될 정도..) 바인드의 가장 기초가 되는 사용법을 알아보면 #include using boost::bind; int f(int a, int b) { return a + b; } int g(int a, int b, int c) { r..
Boost 는.. Boost는 개발을 가속시키는 도구이다. 처음 Boost를 shared_ptr 를 사용하기 위해서 썼었다. 그리고 주변에서 만들어서 써야 한다는 말을 듣고, 직접 smart_ptr을 만들었었다. 하지만, 그 기능에 대한 검증이 힘들고, 버그가 있는지 없는지 알 수 없는 상태를 유지해야만 했다. 그리고 어느날, std::pair 을 사용 하다가, 3개 이상을 묶고 싶을 때, 3개 이상을 한번에 선언 하려고 할 때를 위하여, 템플릿 클래스를 만들어서 썻었으나, 만드는 과정 중 부스트의 tuple 을 본 순간, 나는 다시 boost 를 써야만 한다 라고 생각을 굳힌다. Boost 는 개발을 가속시키는 도구이다. 부스트의 한구절 한구절 코드를 곱씹어 보아야 겠다.