-
boost::asio dynamic buffer프로그래밍/c++ - boost::asio 2018. 5. 1. 14:06반응형
asio에 dynamic_buffer라는 것이 추가되었다.
asio::streambuf와 비슷하지만,
기존의 stl 컨테이너(std::vector, std::string 등)을 래퍼런스로 받아 조작하는 어뎁터 클래스이다.
사용 방식은 다음과 같다.
#include <vector>#include <boost/asio.hpp>int main(){using DynamicBuffer = boost::asio::dynamic_vector_buffer<char, std::allocator<char>>;std::vector<char> buffer;DynamicBuffer dynamicBuffer = boost::asio::dynamic_buffer(buffer);return 0;}api도 기존의 asio::streambuf와 흡사하며 메모리를 공간을 확보, 반환해주는 prepare 함수의 경우 다음과 같이 구현되어있다.
mutable_buffers_type dynamic_buffer::prepare(std::size_t n){if (size () > max_size() || max_size() - size() < n){std::length_error ex("dynamic_vector_buffer too long");boost::asio::detail::throw_exception(ex);}vector_.resize(size_ + n);return boost::asio::buffer(boost::asio::buffer(vector_) + size_, n);}뭔가 확 다른 게 아니라 streambuf에 뭉쳐있던 것들이 좀 분리된 느낌이다.
굳이 streambuf 대신 dynamic_buffer를 사용할만한 이유?
이전 streambuf의 경우 내부 버퍼를 좀 더 직접적으로 엑세스 할 수 없었는데, 이건 메모리 공간이 되는 부분을 직접 건드릴 수 있다는 점?
따라서 디버깅에 좀 더 유리할 순 있을 거 같다.
++
얼로케이터도 직접 지정이 가능하다만, 애초에 asio::streambuf는 asio::basic_streambuf에 std::allocator를 붙인 거 뿐이라 그게 확실한 차별점이라고 할 순 없을 거 같다.
반응형'프로그래밍 > c++ - boost::asio' 카테고리의 다른 글
boost asio, Please define _WIN32_WINNT or _WIN32_WINDOWS appropriately. (0) 2020.05.27 boost/asio deprecated 1.69.0 (0) 2019.03.11 boost 의존성 없이 사용하기. asio standalone (0) 2018.04.07 asio io_service의 dispatch가 post와 다른 점과 적절한 사용처 (0) 2016.05.01 코루틴(coroutine) 사용 중 주의해야 할 부분? (0) 2015.12.26