buffer
函式用於建立一個緩衝區物件,以表示原始記憶體、POD 元素陣列、POD 元素向量或 std::string。
從現有緩衝區建立新的可修改緩衝區。
mutable_buffer buffer( const mutable_buffer & b); » more... mutable_buffer buffer( const mutable_buffer & b, std::size_t max_size_in_bytes); » more...
從現有緩衝區建立新的唯讀緩衝區。
const_buffer buffer( const const_buffer & b); » more... const_buffer buffer( const const_buffer & b, std::size_t max_size_in_bytes); » more...
建立一個新的可修改緩衝區,表示指定的記憶體範圍。
mutable_buffer buffer( void * data, std::size_t size_in_bytes); » more...
建立一個新的唯讀緩衝區,表示指定的記憶體範圍。
const_buffer buffer( const void * data, std::size_t size_in_bytes); » more...
建立一個新的可修改緩衝區,表示指定的 POD 陣列。
template< typename PodType, std::size_t N> mutable_buffer buffer( PodType((&data)[N]); » more... template< typename PodType, std::size_t N> mutable_buffer buffer( PodType((&data)[N], std::size_t max_size_in_bytes); » more...
建立一個新的唯讀緩衝區,表示指定的 POD 陣列。
template< typename PodType, std::size_t N> const_buffer buffer( const PodType((&data)[N]); » more... template< typename PodType, std::size_t N> const_buffer buffer( const PodType((&data)[N], std::size_t max_size_in_bytes); » more...
建立一個新的可修改緩衝區,表示指定的 POD 陣列。
template< typename PodType, std::size_t N> mutable_buffer buffer( boost::array< PodType, N > & data); » more... template< typename PodType, std::size_t N> mutable_buffer buffer( boost::array< PodType, N > & data, std::size_t max_size_in_bytes); » more...
建立一個新的唯讀緩衝區,表示指定的 POD 陣列。
template< typename PodType, std::size_t N> const_buffer buffer( boost::array< const PodType, N > & data); » more... template< typename PodType, std::size_t N> const_buffer buffer( boost::array< const PodType, N > & data, std::size_t max_size_in_bytes); » more...
建立一個新的可修改緩衝區,表示指定的 POD 陣列。
template< typename PodType, std::size_t N> mutable_buffer buffer( std::array< PodType, N > & data); » more... template< typename PodType, std::size_t N> mutable_buffer buffer( std::array< PodType, N > & data, std::size_t max_size_in_bytes); » more...
建立一個新的唯讀緩衝區,表示指定的 POD 陣列。
template< typename PodType, std::size_t N> const_buffer buffer( std::array< const PodType, N > & data); » more... template< typename PodType, std::size_t N> const_buffer buffer( std::array< const PodType, N > & data, std::size_t max_size_in_bytes); » more...
建立一個新的可修改緩衝區,表示指定的 POD 向量。
template< typename PodType, typename Allocator> mutable_buffer buffer( std::vector< PodType, Allocator > & data); » more... template< typename PodType, typename Allocator> mutable_buffer buffer( std::vector< PodType, Allocator > & data, std::size_t max_size_in_bytes); » more...
建立一個新的唯讀緩衝區,表示指定的 POD 向量。
template< typename PodType, typename Allocator> const_buffer buffer( const std::vector< PodType, Allocator > & data); » more... template< typename PodType, typename Allocator> const_buffer buffer( const std::vector< PodType, Allocator > & data, std::size_t max_size_in_bytes); » more...
建立一個新的可修改緩衝區,表示指定的字串。
template< typename Elem, typename Traits, typename Allocator> mutable_buffer buffer( std::basic_string< Elem, Traits, Allocator > & data); » more... template< typename Elem, typename Traits, typename Allocator> mutable_buffer buffer( std::basic_string< Elem, Traits, Allocator > & data, std::size_t max_size_in_bytes); » more...
建立一個新的唯讀緩衝區,表示指定的字串。
template< typename Elem, typename Traits, typename Allocator> const_buffer buffer( const std::basic_string< Elem, Traits, Allocator > & data); » more... template< typename Elem, typename Traits, typename Allocator> const_buffer buffer( const std::basic_string< Elem, Traits, Allocator > & data, std::size_t max_size_in_bytes); » more...
建立一個新的唯讀緩衝區,表示指定的 string_view。
template< typename Elem, typename Traits> const_buffer buffer( basic_string_view< Elem, Traits > data); » more...
建立一個新的唯讀緩衝區,表示指定的字串。
template< typename Elem, typename Traits> const_buffer buffer( basic_string_view< Elem, Traits > data, std::size_t max_size_in_bytes); » more...
從連續容器建立一個新的可修改緩衝區。
template< typename T> mutable_buffer buffer( T & data, constraint_t< is_contiguous_iterator< typename T::iterator >::value, defaulted_constraint > = defaulted_constraint(), constraint_t< !is_convertible< T, const_buffer >::value, defaulted_constraint > = defaulted_constraint(), constraint_t< !is_convertible< T, mutable_buffer >::value, defaulted_constraint > = defaulted_constraint(), constraint_t< !is_const< remove_reference_t< typename std::iterator_traits< typename T::iterator >::reference > >::value, defaulted_constraint > = defaulted_constraint()); » more... template< typename T> mutable_buffer buffer( T & data, std::size_t max_size_in_bytes, constraint_t< is_contiguous_iterator< typename T::iterator >::value, defaulted_constraint > = defaulted_constraint(), constraint_t< !is_convertible< T, const_buffer >::value, defaulted_constraint > = defaulted_constraint(), constraint_t< !is_convertible< T, mutable_buffer >::value, defaulted_constraint > = defaulted_constraint(), constraint_t< !is_const< remove_reference_t< typename std::iterator_traits< typename T::iterator >::reference > >::value, defaulted_constraint > = defaulted_constraint()); » more...
從連續容器建立一個新的唯讀緩衝區。
template< typename T> const_buffer buffer( T & data, constraint_t< is_contiguous_iterator< typename T::iterator >::value, defaulted_constraint > = defaulted_constraint(), constraint_t< !is_convertible< T, const_buffer >::value, defaulted_constraint > = defaulted_constraint(), constraint_t< !is_convertible< T, mutable_buffer >::value, defaulted_constraint > = defaulted_constraint(), constraint_t< is_const< remove_reference_t< typename std::iterator_traits< typename T::iterator >::reference > >::value, defaulted_constraint > = defaulted_constraint()); » more... template< typename T> const_buffer buffer( T & data, std::size_t max_size_in_bytes, constraint_t< is_contiguous_iterator< typename T::iterator >::value, defaulted_constraint > = defaulted_constraint(), constraint_t< !is_convertible< T, const_buffer >::value, defaulted_constraint > = defaulted_constraint(), constraint_t< !is_convertible< T, mutable_buffer >::value, defaulted_constraint > = defaulted_constraint(), constraint_t< is_const< remove_reference_t< typename std::iterator_traits< typename T::iterator >::reference > >::value, defaulted_constraint > = defaulted_constraint()); » more... template< typename T> const_buffer buffer( const T & data, constraint_t< is_contiguous_iterator< typename T::const_iterator >::value, defaulted_constraint > = defaulted_constraint(), constraint_t< !is_convertible< T, const_buffer >::value, defaulted_constraint > = defaulted_constraint(), constraint_t< !is_convertible< T, mutable_buffer >::value, defaulted_constraint > = defaulted_constraint()); » more... template< typename T> const_buffer buffer( const T & data, std::size_t max_size_in_bytes, constraint_t< is_contiguous_iterator< typename T::const_iterator >::value, defaulted_constraint > = defaulted_constraint(), constraint_t< !is_convertible< T, const_buffer >::value, defaulted_constraint > = defaulted_constraint(), constraint_t< !is_convertible< T, mutable_buffer >::value, defaulted_constraint > = defaulted_constraint()); » more...
取得表示整個已註冊緩衝區的緩衝區。
mutable_registered_buffer buffer( const mutable_registered_buffer & b); » more... const_registered_buffer buffer( const const_registered_buffer & b); » more...
取得表示已註冊緩衝區一部分的緩衝區。
mutable_registered_buffer buffer( const mutable_registered_buffer & b, std::size_t n); » more... const_registered_buffer buffer( const const_registered_buffer & b, std::size_t n); » more...
緩衝區物件以一個二元組表示連續的記憶體區域,該二元組由一個指標和以位元組為單位的長度組成。 形式為 {void*, size_t}
的二元組指定一個可變 (可修改) 的記憶體區域。 同樣地,形式為 {const void*, size_t}
的二元組指定一個 const (唯讀) 的記憶體區域。 這兩種形式分別對應於 mutable_buffer
和 const_buffer
類別。 為了反映 C++ 的轉換規則,mutable_buffer
可以隱式轉換為 const_buffer
,反之則不允許。
最簡單的用例涉及讀取或寫入指定大小的單個緩衝區。
sock.send(boost::asio::buffer(data, size));
在上面的例子中,buffer
的返回值符合 ConstBufferSequence 概念的要求,因此可以直接傳遞給 socket 的 write 函式。 為可修改記憶體建立的緩衝區也符合 MutableBufferSequence 概念的要求。
可以從內建陣列、std::vector、std::array 或 boost::array 的 POD 元素建立個別緩衝區。這有助於透過自動判斷緩衝區大小來防止緩衝區溢位。
char d1[128]; size_t bytes_transferred = sock.receive(boost::asio::buffer(d1)); std::vector<char> d2(128); bytes_transferred = sock.receive(boost::asio::buffer(d2)); std::array<char, 128> d3; bytes_transferred = sock.receive(boost::asio::buffer(d3)); boost::array<char, 128> d4; bytes_transferred = sock.receive(boost::asio::buffer(d4));
在以上三種情況下,建立的緩衝區長度恰好為 128 位元組。請注意,在建立或使用緩衝區時,向量絕不會自動調整大小。緩衝區大小是使用向量的 size()
成員函式來確定的,而不是使用它的容量。
可以使用 data()
和 size()
成員函式來存取緩衝區的內容。
boost::asio::mutable_buffer b1 = ...; std::size_t s1 = b1.size(); unsigned char* p1 = static_cast<unsigned char*>(b1.data()); boost::asio::const_buffer b2 = ...; std::size_t s2 = b2.size(); const void* p2 = b2.data();
data()
成員函式允許違反型別安全,因此在應用程式程式碼中使用它時應仔細考慮。
為了方便起見,提供了一個 buffer_size
函式,它適用於緩衝區和緩衝區序列(也就是符合 ConstBufferSequence 或 MutableBufferSequence 類型需求的類型)。在這種情況下,該函式會返回序列中所有緩衝區的總大小。
buffer_copy
函式可用於在個別緩衝區和緩衝區序列之間複製原始位元組。
特別是,當與 buffer_size
函式一起使用時,buffer_copy
函式可用於將緩衝區序列線性化。例如:
vector<const_buffer> buffers = ...; vector<unsigned char> data(boost::asio::buffer_size(buffers)); boost::asio::buffer_copy(boost::asio::buffer(data), buffers);
請注意,buffer_copy
是根據 memcpy
實作的,因此它不能用於在重疊的記憶體區域之間進行複製。
緩衝區物件不擁有它所參考的記憶體。應用程式有責任確保記憶體區域保持有效,直到 I/O 作業不再需要它為止。當記憶體不再可用時,則稱緩衝區已失效。
對於接受 std::vector 類型引數的 buffer
多載,返回的緩衝區物件會因任何向量操作而失效,這些操作也會使所有參考序列中元素的參考、指標和迭代器失效(C++ 標準,23.2.4)。
對於接受 std::basic_string 類型引數的 buffer
多載,返回的緩衝區物件會根據為參考序列中元素的參考、指標和迭代器失效所定義的規則而失效(C++ 標準,21.3)。
緩衝區物件可以使用簡單的算術以安全的方式進行操作,這有助於防止緩衝區溢位。考慮以下列方式初始化的陣列:
boost::array<char, 6> a = { 'a', 'b', 'c', 'd', 'e' };
使用以下程式碼建立的緩衝區物件 b1
b1 = boost::asio::buffer(a);
代表整個陣列 { 'a', 'b', 'c', 'd', 'e' }
。buffer
函式的第二個可選參數可用於限制緩衝區的大小(以位元組為單位)
b2 = boost::asio::buffer(a, 3);
因此 b2
代表資料 { 'a', 'b', 'c' }
。即使大小參數超過陣列的實際大小,所建立的緩衝區物件的大小仍會被限制為陣列大小。
可以將偏移量套用至現有的緩衝區以建立新的緩衝區
b3 = b1 + 2;
其中 b3
將設定為代表 { 'c', 'd', 'e' }
。如果偏移量超過現有緩衝區的大小,則新建立的緩衝區將會是空的。
可以同時指定偏移量和大小,以建立對應於現有緩衝區內特定位元組範圍的緩衝區
b4 = boost::asio::buffer(b1 + 1, 3);
因此 b4
將參考位元組 { 'b', 'c', 'd' }
。
要使用多個緩衝區進行讀取或寫入(即分散-聚集 I/O),可以將多個緩衝區物件指派到支援 MutableBufferSequence(用於讀取)或 ConstBufferSequence(用於寫入)概念的容器中
char d1[128]; std::vector<char> d2(128); boost::array<char, 128> d3; boost::array<mutable_buffer, 3> bufs1 = { boost::asio::buffer(d1), boost::asio::buffer(d2), boost::asio::buffer(d3) }; bytes_transferred = sock.receive(bufs1); std::vector<const_buffer> bufs2; bufs2.push_back(boost::asio::buffer(d1)); bufs2.push_back(boost::asio::buffer(d2)); bufs2.push_back(boost::asio::buffer(d3)); bytes_transferred = sock.send(bufs2);
在命名空間 boost::asio::buffer_literals
中定義的 _buf
字面常數後綴可用於從字串、二進位制整數和十六進位制整數字面常數建立 const_buffer
物件。例如
using namespace boost::asio::buffer_literals; boost::asio::const_buffer b1 = "hello"_buf; boost::asio::const_buffer b2 = 0xdeadbeef_buf; boost::asio::const_buffer b3 = 0x0123456789abcdef0123456789abcdef_buf; boost::asio::const_buffer b4 = 0b1010101011001100_buf;
請注意,與緩衝區字面常數關聯的記憶體在程式的生命週期內有效。這表示緩衝區可以安全地用於非同步操作。
標頭檔:boost/asio/buffer.hpp
便利標頭檔:boost/asio.hpp