LINUX.ORG.RU

Создать буфер из двух указатель без копирования

 ,


1

3

Привет всем,

Возможно ли создать буфер, части которого указывают на разные участки памяти. Пример:

uchar top[10]; uchar bottom[10];

struct Buffer { uchar * top, * bottom; }

Buffer buffer; buffer.top = & top; buffer.bottom = & bottom;

и далее использовать buffer как единый массив.

process( buffer, size20 );

Есть ли в C/C++ решение такой задачи?

С уважением, Виктор.


В чём проблема представить один буффер как два?

pon4ik ★★★★★ ()

Если ты хочешь объединить два буфера, лежащих в разных частях памяти и потом оперировать им как единым целым, то нет. Нужно будет делать process( buffer, size20 ); способным работать с таким типом.

ox55ff ★★★ ()

Маленькие буферы на десять байтов — вряд ли. Но можно сделать это с точностью до страницы памяти. См. shm_open(3) и mmap(2). Я когда-то видел, как такой подход применяли для организации кольцевого буфера: вторая половинка массива отображалась на ту же физическую память, что и первая.

ilammy ★★★ ()

Возможно ли

Конечно. Если нужно что-то готовое, расказывай подробнее о задаче. Если велосипеды допустимы, тут три варианта:

  • сделать process() специализированной функцией, работающей только с множеством буферов(как уже сказали выше)
  • написать свой контейнер, скрывающий представление, а интерфейс сделать стандартный для sequence container из stl(простой адаптер, по сути, но букв много)
  • налабать специфические итераторы(man boost::asio::buffers_iterator<> для примера)
Deleted ()

Можно, если прямое обращение по индексу не используется, а все делается через методы класса, «умные» итераторы или специально предназначенные для работы с буфером функции (если в стиле С работать)

annulen ★★★★★ ()

Участки памяти изначально разделены и повлиять на это нельзя? А то ведь можно определить pragma pack(1), например, а затем обернуть участки выделяемой памяти в struct. Тогда задача становится тривиальной.

qub ()

это двухуровневая итерация, как ни крути; «решение» здесь только компактный синтаксис, скрывающий реализацию forward(|bi) iterator. «массив» или random access iterator не вижу смысла эмулировать - скорость никакая относительно vector, исключение - при одинаковом размере блоков можно их обьединить в контейнер с доступом O(1) ( container[index] => container.blocks[index/chunk_size][index%chunk_size] ).

по первому варианту см boost.iterator iterator_facade, range-v3 concat

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.