В STL их нет.
Я понимаю, что вы беспокоитесь о производительности, и особенно о памяти.Однако чтение без выравнивания (требующее сдвига битов) может быть медленнее, чем обычное (на границах байтов), поэтому я бы рекомендовал сохранять целые байты.Это означает:
- 12 бит, 16 бит:
uint16_t
- 20 бит, 24 бита: либо 3
uint8_t
, либо 1 uint32_t
(скорость компромисса / память) - 32 бита:
uint32_t
- 40 бит: 5
uint8_t
, 3 uint16_t
или 1 uint64_t
Предполагается, что вы выбрали более простое решение(т. е. всегда возвращаясь к следующему доступному целому числу), вы можете использовать что-то вроде:
boost::variant<
std::vector<uint16_t>,
std::vector<uint32_t>,
std::vector<uint64_t>
>
Это позволит вам выбрать точное значение vector
, которое будет использоваться во время выполнения, на основе количества необходимых вам байтов.для хранения.
Если вы хотите сэкономить как можно больше, то вам просто нужно добавить std::vector<uint8_t>
в список.Но я бы воздержался от этого и, возможно, только "упаковал" 40-битный регистр (в uint16_t
), так как другие никогда не тратят много памяти в любом случае ... и я, вероятно, хотел бы проверить обе альтернативы.
Примечание: вы также можете настроить использование векторной памяти, проверив, что capacity
не превышает size
слишком сильно.