Boost C++ 函式庫

...全世界最受推崇且設計精良的 C++ 函式庫專案之一。 Herb SutterAndrei Alexandrescu,《C++ 程式碼規範

PrevUpHomeNext

buffer

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_bufferconst_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

要使用多個緩衝區進行讀取或寫入(即分散-聚集 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


PrevUpHomeNext