Ich brauche eine minimale Größe Implementierung einer Reihe von Bools. Die Größe des Arrays ist zur Kompilierzeit bekannt.Minimale Größe Implementierung für Bool-Array
Ich überprüfte std::bitset
und boost::array
, aber beide verursachen einen Overhead, der für kleine Arrays von Bedeutung ist. Wenn die Array-Größe beispielsweise ist, sollte der Container nur 1 Byte des Arbeitsspeichers verwenden (unter der Annahme einer gemeinsamen CPU-Architektur).
Gibt es das oder muss ich meine eigenen rollen?
BEARBEITEN: Hier ist meine endgültige Implementierung basierend auf dem Beitrag von Tom Knapen. Ich habe einen Standardwert für den Konstruktor hinzugefügt und im Falle eines Out-of-Bounds-Indexes das Argument hinzugefügt. Vielen Dank an Tom und alle anderen.
#include <stdexcept>
#include <climits>
/// Minimum size container for bool-arrays
/**
* TODO: may want to add to_uint32_t accessor and the like
* for sufficently small arrays
*/
template<int SIZE>
class bitarray
{
public:
bitarray(bool initial_value = false);
bool get(int index) const;
void set(int index, bool value);
private:
static const int ARRAY_SIZE = (SIZE + CHAR_BIT - 1)/8;
unsigned char mBits[ARRAY_SIZE];
};
// ----------------------------------------------------
// Definitions
// ----------------------------------------------------
template<int SIZE>
inline bitarray<SIZE>::bitarray(bool initial_value)
{
for(int i = 0; i < ARRAY_SIZE; ++i)
mBits[i] = initial_value ? -1 : 0;
}
template<int SIZE>
inline bool bitarray<SIZE>::get(int index) const
{
if (index >= SIZE)
throw std::out_of_range("index out of range");
return (mBits[index/CHAR_BIT] & (1 << (index % CHAR_BIT)));
}
template<int SIZE>
inline void bitarray<SIZE>::set(int index, bool value)
{
if (index >= SIZE)
throw std::out_of_range("index out of range");
if (value)
mBits[index/CHAR_BIT] |= (1 << (index % CHAR_BIT));
else
mBits[index/CHAR_BIT] &= ~(1 << (index % CHAR_BIT));
}
'std: bitset' nur ein Bit pro Element verwendet werden soll (wie' std :: vector 'tut in einigen Implementierungen). Wie haben Sie überprüft, dass es mehr verwendet? –
@ FrédéricHamidi Wenn Sie 'sizeof (std :: vector)' es gibt 40 –
@ Frédéric Hamidi: Using sizeof Betreiber. Dies ist Teil der Implementierung, verwendet dynamische Zuordnung: \t _WordT * _M_wp; \t size_t_M_bpos; Kann für andere std-Implementierungen anders sein –