Нет ... вы не можете сделать это как один семантический тип значения ... любые данные класса должны быть кратны 8-битному размеру символа (с учетом всех обычных подсказок о CHAR_BITS и т. Д.).
Тем не менее, давайте хвататься за соломинку ...
К сожалению, вы явно обрабатываете очень много элементов данных.Если это больше, чем 64 КБ, любой прокси-объект в пользовательском контейнере упакованных значений, вероятно, тоже будет нуждаться в> 16-битном индексе / дескрипторе, но все же одна из немногих возможностей, которую я вижу, заслуживает дальнейшего рассмотрения.Это может подойти, если вы активно работаете с семантическим поведением значений и нуждаетесь в нем только для небольшого подмножества значений в один момент времени.
struct Proxy
{
Int20_Container& container_; // might not need if a singleton
Int20_Container::size_type index_;
...
};
Итак, прокси может быть 32, 64 или болеебиты - потенциальная выгода возможна только в том случае, если вы можете создавать их «на лету» из индексов в контейнер, делать так, чтобы они записывали прямо обратно в контейнер, и сохранять их недолговечными одновременно с несколькими.(Один простой способ - не обязательно самый быстрый - реализовать эту модель - это использовать набор битов или вектор STL в качестве Int20_Container и либо сохранить 20-кратный логический индекс в index_, либо умножить на лету.)
Также неясно, что, хотя ваши значения находятся в пределах 20-битного пространства, в действительности вы используете не более 64 тыс. Различных значений.Если у вас есть такое понимание вашего набора данных, вы можете создать справочную таблицу, в которой 16-битные индексы массива отображаются в 20-битные значения.