【Boost】boost库asio详解7——boost::asio::buffer用法
1. asio::buffer常用的構造方法
asio::buffer有多種的構造方法,而且buffer大小是自動管理的1.1 字符數組
[cpp]?view plain?copy ?print?1.2 字符向量
[cpp]?view plain?copy ?print?1.3 boost的數組
[cpp]?view plain?copy ?print?1.4 字符串
[cpp]?view plain?copy ?print?2. asio::buffer的常用方法
2.1 轉換方法
[cpp]?view plain?copy ?print?2.2 獲取大小
[cpp]?view plain?copy ?print?3. asio::buffer的讀寫問題
注意 的是boost::asio::const_buffer是只讀的buffer, 而boost::asio::mutable_buffer則可寫。讀寫buffer也是有講究的?
3.1 與transfer_all()結合
[cpp]?view plain?copy ?print?3.2 與transfer_at_least()結合
[cpp]?view plain?copy ?print?當然還有最常用的bytes_transferred,這個例子就很多了。?
streambuf
asio::streambuf則是提供了一個流類型的buffer,它自身是能申請內存的。它的好處是可以通過stl的stream相關函數實現緩沖區操作,處理起來更加方便。
????//通過streambuf發送數據
????asio::streambuf?b;
????std::ostream?os(&b);
????os <<?"Hello, World!\n";
????size_t?n = sock.send(b.data());????// try sending some data in input sequence
????b.consume(n);?// sent data is removed from input sequence
?
????//通過streambuf讀數據
????asio::streambuf?b;
????asio::streambuf::mutable_buffers_type?bufs = b.prepare(512);????// reserve 512 bytes in output sequence
????size_t?n = sock.receive(bufs);
????b.commit(n);????// received data is "committed" from output sequence to input sequence
????std::istream?is(&b);
????std::string?s;
????is >> s;
另外,asio名字空間下還提供了一個的read_until函數,可以實現讀到滿足指定條件的字符串為止,對于解析協議來說非常有用。
????size_t?n = asio::read_until(sock, stream,?'\n');
????asio::streambuf::const_buffers_type?bufs = sb.data();
????std::string?line(asio::buffers_begin(bufs), asio::buffers_begin(bufs) + n);
這個指定條件除了是字符串外,還可以是正則表達式,非常給力。這也是asio庫為什么要依賴于boost.regex的原因。(雖然regex已經標準化了,但仍得使用boost.regex庫。等什么時候asio也標準化后估計就可以直接使用std.regex庫了)
自定義內存分配
異步IO操作時往往會申請動態內存,使用完后就釋放掉;在IO密集型的場景中,頻繁的申請釋放內存對性能會有較大影響。為了避免這個問題,asio提供了一個內存池式的模型?asio_handler_allocate?和?asio_handler_deallocate?來復用內存。
例子我就不寫了,可以參看boost官方文檔示例,或者網上的這篇文章。
就我個人而言,并不贊成在項目的前期就使用上這個allocator,畢竟這樣帶來了很大的代碼復雜度。而是作為一個性能優化點,在后期性能優化的時候再試試用它有沒有效果。并且內存池的也有很多不同的方案,google的google-perftools也值得一試。
總結
以上是生活随笔為你收集整理的【Boost】boost库asio详解7——boost::asio::buffer用法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Boost】boost库asio详解6
- 下一篇: 【Boost】boost库asio详解8