Загрузка памяти стоит намного больше, чем простые арифметические инструкции в CPU, поэтому вы не должны использовать массивы uint8
, как это. Читать каждый элемент будет стоить вам много нагрузки. По крайней мере, используйте массив uint16
, так как на один груз меньше
uint16 arr1[N]; // byte 0-15
uint8 arr2[N]; // byte 16-23
uint8 arr3[N / 4]; // byte 25-26
Но это все еще медленно. Быстрое решение - прочитать все 13 uint32
(или uint64
, если вы используете 64-битную машину) одновременно в цикле, а затем извлечь их в 16 26-битную int
с, Есть много способов сохранить эти 26-битные int
с в 13 unint32
с. Например, хранить каждый 26-битный int
s непрерывно.
A 0 A 1 ... A 15
Или сохраняя первые 32 байта для бита 16-15 элементов, следующие 16 байтов для бита каждого элемента 16-23, последние байты будут использоваться для бита 24-25. Карта памяти будет такой
B00: A₀₀[00..07]
B01: A₀₀[08..15]
B02: A₀₁[00..07]
B03: A₀₁[08..15]
...
B30: A₁₅[00..07]
B31: A₁₅[08..15]
B32: A₀₀[16..23]
B33: A₀₁[16..23]
...
B47: A₁₅[16..23]
B48: A₀₀[24..25]A₀₁[24..25]A₀₂[24..25]A₀₃[24..25]
B49: A₀₄[24..25]A₀₅[24..25]A₀₆[24..25]A₀₇[24..25]
B50: A₀₈[24..25]A₀₉[24..25]A₁₀[24..25]A₁₁[24..25]
B51: A₁₂[24..25]A₁₃[24..25]A₁₄[24..25]A₁₅[24..25]
Это обычно используется в графических форматах с нечетным числом битов на канал . Например, для 10 бит на формат канала каждый пиксель будет сохранен в 5 байтах, первые четыре сохранят старшие 8 бит каждого пикселя, а младшие 2 бита каждого пикселя будут упакованы в оставшийся байт
Вам следует протестировать и выбрать самый быстрый в вашем случае.