Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

buffer

Boost , Boost.Asio , Reference

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

Функция<boost::asio::buffer>используется для создания буферного объекта для представления сырой памяти, массива POD-элементов, вектора POD-элементов или std::string.

mutable_buffers_1 buffer(
    const mutable_buffer & b);
  » more...
mutable_buffers_1 buffer(
    const mutable_buffer & b,
    std::size_t max_size_in_bytes);
  » more...
const_buffers_1 buffer(
    const const_buffer & b);
  » more...
const_buffers_1 buffer(
    const const_buffer & b,
    std::size_t max_size_in_bytes);
  » more...
mutable_buffers_1 buffer(
    void * data,
    std::size_t size_in_bytes);
  » more...
const_buffers_1 buffer(
    const void * data,
    std::size_t size_in_bytes);
  » more...
template<
    typename PodType,
    std::size_t N>
mutable_buffers_1 buffer(
    PodType (&data)[N]);
  » more...
template<
    typename PodType,
    std::size_t N>
mutable_buffers_1 buffer(
    PodType (&data)[N],
    std::size_t max_size_in_bytes);
  » more...
template<
    typename PodType,
    std::size_t N>
const_buffers_1 buffer(
    const PodType (&data)[N]);
  » more...
template<
    typename PodType,
    std::size_t N>
const_buffers_1 buffer(
    const PodType (&data)[N],
    std::size_t max_size_in_bytes);
  » more...
template<
    typename PodType,
    std::size_t N>
mutable_buffers_1 buffer(
    boost::array< PodType, N > & data);
  » more...
template<
    typename PodType,
    std::size_t N>
mutable_buffers_1 buffer(
    boost::array< PodType, N > & data,
    std::size_t max_size_in_bytes);
  » more...
template<
    typename PodType,
    std::size_t N>
const_buffers_1 buffer(
    boost::array< const PodType, N > & data);
  » more...
template<
    typename PodType,
    std::size_t N>
const_buffers_1 buffer(
    boost::array< const PodType, N > & data,
    std::size_t max_size_in_bytes);
  » more...
template<
    typename PodType,
    std::size_t N>
const_buffers_1 buffer(
    const boost::array< PodType, N > & data);
  » more...
template<
    typename PodType,
    std::size_t N>
const_buffers_1 buffer(
    const boost::array< PodType, N > & data,
    std::size_t max_size_in_bytes);
  » more...
template<
    typename PodType,
    std::size_t N>
mutable_buffers_1 buffer(
    std::array< PodType, N > & data);
  » more...
template<
    typename PodType,
    std::size_t N>
mutable_buffers_1 buffer(
    std::array< PodType, N > & data,
    std::size_t max_size_in_bytes);
  » more...
template<
    typename PodType,
    std::size_t N>
const_buffers_1 buffer(
    std::array< const PodType, N > & data);
  » more...
template<
    typename PodType,
    std::size_t N>
const_buffers_1 buffer(
    std::array< const PodType, N > & data,
    std::size_t max_size_in_bytes);
  » more...
template<
    typename PodType,
    std::size_t N>
const_buffers_1 buffer(
    const std::array< PodType, N > & data);
  » more...
template<
    typename PodType,
    std::size_t N>
const_buffers_1 buffer(
    const std::array< PodType, N > & data,
    std::size_t max_size_in_bytes);
  » more...
template<
    typename PodType,
    typename Allocator>
mutable_buffers_1 buffer(
    std::vector< PodType, Allocator > & data);
  » more...
template<
    typename PodType,
    typename Allocator>
mutable_buffers_1 buffer(
    std::vector< PodType, Allocator > & data,
    std::size_t max_size_in_bytes);
  » more...
template<
    typename PodType,
    typename Allocator>
const_buffers_1 buffer(
    const std::vector< PodType, Allocator > & data);
  » more...
template<
    typename PodType,
    typename Allocator>
const_buffers_1 buffer(
    const std::vector< PodType, Allocator > & data,
    std::size_t max_size_in_bytes);
  » more...
template<
    typename Elem,
    typename Traits,
    typename Allocator>
const_buffers_1 buffer(
    const std::basic_string< Elem, Traits, Allocator > & data);
  » more...
template<
    typename Elem,
    typename Traits,
    typename Allocator>
const_buffers_1 buffer(
    const std::basic_string< Elem, Traits, Allocator > & data,
    std::size_t max_size_in_bytes);
  » more...

Буферный объект представляет собой прилежащую область памяти в виде 2-х строк, состоящую из указателя и размера в байтах. Кортеж формы<{void*,size_t}>определяет изменяемую (изменяемую) область памяти. Аналогично, кортеж формы<{constvoid*,size_t}>определяет конст (неизменяемую) область памяти. Эти две формы соответствуют классам<mutable_buffer>и<const_buffer>соответственно. Чтобы отразить правила конверсии C++, a<mutable_buffer>неявно конвертируется в<const_buffer>, и противоположное преобразование не допускается.

Самый простой вариант использования включает в себя чтение или написание одного буфера определенного размера:

sock.send(boost::asio::buffer(data, size));

В приведенном выше примере возвращаемое значение<boost::asio::buffer>соответствует требованиям концепции ConstBufferSequence, так что оно может быть непосредственно передано функции записи розетки. Буфер, созданный для модифицируемой памяти, также отвечает требованиям концепции 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()>, а не его емкости.

Accessing Buffer Contents

Содержимое буфера может быть доступно с помощью функций<buffer_size>и<buffer_cast>:

boost::asio::mutable_buffer b1 = ...;
std::size_t s1 = boost::asio::buffer_size(b1);
unsigned char* p1 = boost::asio::buffer_cast<unsigned char*>(b1);
boost::asio::const_buffer b2 = ...;
std::size_t s2 = boost::asio::buffer_size(b2);
const void* p2 = boost::asio::buffer_cast<const void*>(b2);

Функция<boost::asio::buffer_cast>допускает нарушения безопасности типа, поэтому использование ее в коде приложения должно быть тщательно рассмотрено.

Для удобства функция<buffer_size>также работает на буферных последовательностях (т.е. типах, отвечающих требованиям типа ConstBufferSequence или MutableBufferSequence). В этом случае функция возвращает общий размер всех буферов в последовательности.

Buffer Copying

Функция<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>, и, следовательно, его нельзя использовать для копирования между перекрывающимися областями памяти.

Buffer Invalidation

Буферный объект не имеет никакого права собственности на память, к которой он относится. Обязанностью приложения является обеспечение того, чтобы область памяти оставалась действительной до тех пор, пока она больше не потребуется для операции ввода-вывода. Когда память больше не доступна, буфер считается недействительным.

Для<boost::asio::buffer>перегрузок, которые принимают аргумент типа std::vector, возвращаемые буферные объекты обесцениваются любой векторной операцией, которая также обесценивает все ссылки, указатели и итераторы, относящиеся к элементам в последовательности (C++ Std, 23.2.4).

Для<boost::asio::buffer>перегрузок, принимающих аргумент типа std::basic_string, возвращаемые буферные объекты признаются недействительными согласно правилам, определенным для признания недействительными ссылок, указателей и итераторов, относящихся к элементам последовательности (C++ Std, 21.3).

Buffer Arithmetic

Буферными объектами можно манипулировать с помощью простой арифметики безопасным способом, который помогает предотвратить переполнение буфера. Рассмотрим массив, инициализированный следующим образом:

boost::array<char, 6> a = { 'a', 'b', 'c', 'd', 'e' };

Буферный объект<b1>, созданный с использованием:

b1 = boost::asio::buffer(a);

Он представляет собой весь массив<{'a','b','c', 'd','e'}>. Дополнительный второй аргумент функции<boost::asio::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'}>[[<{'b','c', 'd'}>] [[<{'b','c', 'd'}>]]] [[[<{'b','c', 'd'}>]]]][[править править код]]

Buffers and Scatter-Gather 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);
Requirements

Заголовок:<boost/asio/buffer.hpp>

Заголовок удобства:<boost/asio.hpp>


PrevUpHomeNext

Статья buffer раздела Boost.Asio Reference может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Reference ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-07-05 00:05:52/0.0058128833770752/0