-
boost::asio::streambuf에 custom memory allocator 붙이기프로그래밍/c++ - boost::asio 2015. 11. 7. 09:00반응형
boost::asio::streambuf의 메모리 할당자로 boost::pool_allocator를 사용하려고 했다.
근데...
보이는 것처럼 인자로 std::allocator를 복사로 받을 뿐, custom allocator를 지원하지 않게 되어있다.
하지만 asio의 streambuf가 커스텀 메모리 할당자를 지원하지 않는다는 게 이상해서 좀 더 찾아보니, boost::asio::basic_streambuf가 템플릿 인자로 메모리 할당자를 받더라.
다음은 basic_streambuf에 pool_allocator를 조합한 모습이다.
streambuf의 정의를 찾아보면, basic_streambuf의 할당자가 std::allocator로 설정이 되어있을 뿐이라는 것을 알 수 있다.
따라서, 모든 boost::asio::streambuf를 사용했던 모든 코드들을
custom allocator가 적용된 basic_streambuf를 쓰는 코드로 바꿔 사용해도 문제가 없을 것이다.
다음은 boost::archive, boost::pool_alloc, basic_streambuf의 조합한 사용 예제.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869#include <iostream>#include <boost/asio.hpp>#include <boost/archive/binary_oarchive.hpp>#include <boost/archive/binary_iarchive.hpp>#include <boost/pool/pool_alloc.hpp>class user{public:friend class boost::serialization::access;public:user(): user{ 0, "noname" }{}user(int age, const std::string& name): age{ age }, name{ name }{}template < typename Archive >void serialize(Archive& ar, const unsigned int version){ar & name;ar & age;}void introduce(){std::cout << "hi guys i'm " << name << ". " << age << " old." << std::endl;}private:int age;std::string name;};using pool_allocator = boost::pool_allocator<char>;boost::asio::basic_streambuf<pool_allocator> bs;void save(){boost::archive::binary_oarchive oa{ bs };user u{14, "jeon"};oa << u;}void load(){boost::archive::binary_iarchive ia{ bs };user u;ia >> u; // 스트림으로부터 불러온다.u.introduce();}int main(){save();load();return 0;}cs 반응형'프로그래밍 > c++ - boost::asio' 카테고리의 다른 글
asio::strand의 올바른 사용법 (0) 2015.12.02 boost::asio의 송신 함수. async_write, async_write_some, async_send의 차이 (0) 2015.11.10 boost::asio deadline_timer를 이용한 유니티의 Invoke함수 흉내 내기 (0) 2015.09.28 boost::asio 완료 핸들러에 제네릭 람다 사용 시 있었던 문제 (0) 2015.09.17 boost::asio::streambuf 분석.. (0) 2015.09.15