Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
До С++11 было достаточно проблематично специализировать шаблонную функцию std::copy на вызов memcpy/memmove из-за отсутствия is_trivially_copy_assignable (и средств на поднятие).
А ещё std::copy_backward перед вызовом memmove проверяет размер копируемого участка на 0, что негативно отражается на оптимизации.
std::move от std::copy, в том, что тут происходит именно перемещение, грубо, с использованием перемещающего конструктора/оператора присваивания. Сравните метакод для std::copy и std::move:memmove() — она, несмотря на своё название, не делает перемещения, а так же делает копирование, но отрабатывает корректно ситуацию для пересекающихся областей: manned.org/memmove.3. Но в части оптимизации помнить о них стоит, особенно когда нужно подвинуть массивы не POD элементов.mmap() применять тут не совсем корректно.создали временный файл, записали туда данные
просто второй буфер
Какого размера? Ведь размер получаемых данных заранее не известен (исходя из условия задачи).
uint8_t inbuffer[PKT_SIZE];
uint8_t tmpbuffer[PKT_SIZE];
while есть данные {
stream.read(inbuffer, PKT_SIZE);
offset = search_sync(inbuffer);
std::copy(inbuffer + offset, inbuffer + PKT_SIZE, tmpbuffer);
if offset > 0 {
stream.read(inbuffer, PKT_SIZE);
std::copy(inbuffer, inbuffer + (PKT_SIZE - offset), tmpbuffer + PKT_SIZE - offset);
process(tmpbuffer);
// тут что-то делаем с остатками в inbuffer
} else {
process(tmpbuffer);
}
}
std::copyдолжна стоять запись во временный файл, да, скорее всего, код будет несколько проще визуально, но сути вещей, скрывающимся за ним, это не меняет.
C++ и копирование перекрывающихся областей памяти