Я не уверен, что вы сохраните что-либо с вашей существующей структурой, поскольку окружающая структура все еще округляется до целого числа байтов.
Вы можете написать следующее для сжатия 4 2-битныхсчетчики в 1 байт, но, как вы говорите, вы должны назвать их myInst.f0:
struct MyStruct
{
ubyte_t f0:2,
f1:2,
f2:2,
f3:2;
} myInst;
В c и c ++ 98 вы можете объявить это анонимным, но это использование не рекомендуется.Теперь вы можете получить доступ к 4 значениям напрямую по имени:
struct
{ // deprecated!
ubyte_t f0:2,
f1:2,
f2:2,
f3:2;
};
Вы можете объявить какой-то шаблон, который обертывает один экземпляр с помощью операторов int и operator = (int), а затем определить объединение для размещения4 экземпляра в одном месте, но опять же анонимные союзы устарели.Однако вы можете объявить ссылки на свои 4 значения, но затем вы платите за ссылки, которые больше, чем байты, которые вы пытались сохранить!
template <class Size,int offset,int bits>
struct Bitz
{
Size ignore : offset,
value : bits;
operator Size()const { return value; }
Size operator = (Size val) { return (value = val); }
};
template <class Size,int bits>
struct Bitz0
{ // I know this can be done better
Size value : bits;
operator Size()const { return value; }
Size operator = (Size val) { return (value = val); }
};
static union
{ // Still deprecated!
Bitz0<char, 2> F0;
Bitz<char, 2, 2> F1;
Bitz<char, 4, 2> F2;
Bitz<char, 6, 2> F3;
};
union
{
Bitz0<char, 2> F0;
Bitz<char, 2, 2> F1;
Bitz<char, 4, 2> F2;
Bitz<char, 6, 2> F3;
} bitz;
Bitz0<char, 2>& F0 = bitz.F0; /// etc...
В качестве альтернативы, вы можете просто объявить макросы для заменыпунктирное имя с простым именем (как 1970-е годы):
# define myF0 myInst.f0
Обратите внимание, что вы не можете передавать битовые поля по ссылке или по указателю, поскольку они не имеютадрес байта, только по значению и присваиванию.