Вы можете дать мой PackedArray код попробовать с bitsPerItem
из 1
.
Он реализует контейнер произвольного доступа, где элементы упакованы на уровне бит. Другими словами, он действует так, как будто вы можете манипулировать, например, uint9_t
или uint17_t
массив:
PackedArray principle:
. compact storage of <= 32 bits items
. items are tightly packed into a buffer of uint32_t integers
PackedArray requirements:
. you must know in advance how many bits are needed to hold a single item
. you must know in advance how many items you want to store
. when packing, behavior is undefined if items have more than bitsPerItem bits
PackedArray general in memory representation:
|-------------------------------------------------- - - -
| b0 | b1 | b2 |
|-------------------------------------------------- - - -
| i0 | i1 | i2 | i3 | i4 | i5 | i6 | i7 | i8 | i9 |
|-------------------------------------------------- - - -
. items are tightly packed together
. several items end up inside the same buffer cell, e.g. i0, i1, i2
. some items span two buffer cells, e.g. i3, i6
Эффективное с точки зрения памяти или процессора? – robert 2010-12-07 01:09:52
@robert: Я полагаю, что с точки зрения памяти в первую очередь. Это из-за небольшого количества накладных расходов на обработку, но серьезных накладных расходов в случае пропусков кеша. – ruslik 2010-12-07 01:23:13
@robert: есть разница? Если есть большое количество бит, производительность будет ограничена промахами кеша, поэтому упаковка бит настолько сильно, насколько это возможно, даст лучшую производительность. Только в том случае, если имеется очень мало бит, может быть более эффективным использование целого байта (или более) на бит. – 2010-12-07 04:05:25