Как на самом деле называется вышеуказанная техника?
Битовые поля.И вы должны использовать только int
(signed
, unsigned
или другое) в качестве «типа», а не char
.
Выше класса четыре байта в размере,или один байт в размере?
Ни то, ни другое.Вероятно, это sizeof(int)
, потому что компилятор генерирует объект размером с слово.Однако фактические битовые поля будут храниться в байте.Это просто потратит некоторое пространство.
Переменные обрабатываются как 1 (или 3) бит, как показано, или согласно 'unsigned char', рассматриваются как байты каждый?
Они представляют только указанные биты и будут упакованы настолько плотно, насколько это возможно.
Есть ли какое-то сочетание битов с централизованным байтом?Например:
Используйте union
:
struct bits {
unsigned A:1;
unsigned B:3;
unsigned C:1;
unsigned D:3;
};
union SplitByte {
struct bits Bits;
unsigned char Byte[sizeof(struct bits)];
/* the array is a trick so the two fields
are guaranteed to be the same size and
thus be aligned on the same boundary */
} SplitByteObj;
// access the byte
SplitByteObj.Byte[0]
// access a bitfield
SplitByteObj.Bits.B
Обратите внимание, что существуют проблемы с битовыми полями, например, при использовании потоков.К каждому битовому полю нельзя получить доступ по отдельности, поэтому вы можете получить ошибки, если попытаетесь использовать мьютекс для защиты каждого из них.Кроме того, порядок, в котором расположены поля, не определен стандартом.По этой причине многие люди предпочитают использовать побитовые операторы для реализации битовых полей вручную.
Есть ли статья, которая более подробно освещает эту тему?
Не так много.Первые несколько, которые вы получите, когда вы Google, это все, что вы найдете.Они не широко используются конструкции.Лучше всего придираться к стандарту, чтобы выяснить, как именно они работают, чтобы вас не укусил странный крайний случай.Я не могу сказать вам точно, где в стандарте они указаны.
Если 'A: 1' обрабатывается как целый байт, то в чем смысл / пурпур?
Это не так, но я уже говорил об этом.