как решить более эффективно задачу на С++ (неэффективное, но правильно работающее решение имеется):
typedef std::vector<uint8_t> Fragment;
std::vector< Fragment > buff_of_fragments;
std::array<uint8_t, 64> byte_buff;
std::array<uint16_t, 32> word_buff;
buff_of_fragments занимает 80% памяти и дефрагментировать его нет возможности. Фрагменты в общем случае могут иметь разную длину. Требуется копировать последовательно по частям для быстрой обработки
1. из buff_of_fragments в byte_byff
2. из buff_of_fragments в word_byff
задача усложняется тем, что данные в buff_of_fragments начинаются не с нулевого байта buff_of_fragments[0][0], а со смещения offset, т.е. с buff_of_fragments[0][offset].
операция
reinterpret_cast<uint16_t*>(&buff_of_fragments[0][offset]);
небезопасна для нечетных offset из-за архитектурных особенностей процессора (MIPS).
На данный момент на ум приходит побайтное копирование из buff_of_fragments в byte_byff с поиском позиции байта в buff_of_fragments. Например, мне надо скопировать байты с позиции дефрагментированного вектора:
std::copy(defrag_buff.begin() + 1280, defrag_buff.begin() + 1280 + 64, byte_buff.begin());
но, поскольку дефрагментация невозможна, я должен найти каким-то образом (последовательным или методом дихотометрии) номер фрагмента и смещение в buff_of_fragments[fr_nr][offset1] для позиции 1280. Последняя, копируемая в byte_buff, позиция 1280 + 64 может находиться в другом фрагменте buff_of_fragments[fr_nr + n][offset2].
Для начала, хотя бы, как быстро найти fr_nr?