Sie können meine PackedArray Code einen Versuch mit einem bitsPerItem
von geben 1
.
Es implementiert einen Container mit wahlfreiem Zugriff, in dem Elemente auf der Bit-Ebene gepackt werden. Mit anderen Worten, es verhält sich so, als ob Sie in der Lage wären, z.B. uint9_t
oder uint17_t
Array:
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
Effiziente in Bezug auf Speicher oder CPU? – robert
@robert: Ich nehme an, dass in Bezug auf Speicher in erster Linie. Es ist wegen des geringen möglichen Verarbeitungsaufwands, aber ernster Overheads im Falle von Cache-Misses. – ruslik
@robert: Es gibt einen Unterschied? Wenn es eine große Anzahl von Bits gibt, wird die Leistung durch Cache-Fehltreffer gebunden, so dass das bestmögliche Packen der Bits die beste Leistung ergibt. Nur wenn es sehr wenige Bits gibt, könnte es effizienter sein, ein ganzes Byte (oder mehr) pro Bit zu verwenden. –