Мне нужна реализация минимального размера массива bools. Размер массива известен во время компиляции.Реализация минимального размера для массива bool
Я проверил std::bitset
и boost::array
, но они оба несут накладные расходы, что важно для небольших массивов. Например, если размер массива равен , то в контейнере должно использоваться только 1 байт памяти (при условии общей архитектуры ЦП).
Означает ли это, нужно ли мне рулон самостоятельно?
EDIT: Вот моя окончательная реализация, основанная на посту Тома Кенапена. Я добавил значение по умолчанию для конструктора и добавил бросание в случае индекса вне пределов. Огромное спасибо Тому и всем остальным.
#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));
}
'станд: bitset' должен использовать только один бит для каждого элемента (как' станд :: вектор 'делает в некоторых реализации). Как вы проверили, что он использует больше? –
@ FrédéricHamidi, если вы делаете 'sizeof (std :: vector)' it возвращает 40 –
@ Frédéric Hamidi: Использование оператора sizeof. Это часть реализации, она использует динамическое распределение: \t _WordT * _M_wp; \t size_t _M_bpos; Может быть другим для других реализаций std –