2009-05-05 8 views
16

Если у меня есть C++-структура, определение слова 64bit данных, такие как ..Что C++ структура синтаксис «а: Ь» означает

struct SMyDataWord 
{ 
    int Name : 40; 
    int Colour : 24; 
}; 

Что синтаксис : 40 значит ... это значит, что первые 40 бит зарезервированы для имени и остальных 24 бит для цвета?

Так оно и используется, но я не сталкивался с этим раньше.

ответ

16

Биты, переносимые с C. Name - 40 бит в ширину, Colour - 24 бита в ширину. Следовательно, ваша структура имеет не менее 64 бит. В моей системе 64 бита будут 8 байтов.

+6

В какой системе будет 64 бит не 8 байтов? –

+10

Чтобы быть педантичным, количество бит в байте зависит от реализации (см. Любой из стандартов C, C++). Это задается макросом CHAR_BIT в заголовке «limits». – dirkgently

+1

Некоторые мэйнфреймы IBM имели 9 бит байта, IIRC. –

7

Да, это синтаксис для bitfields. Они обычно используются для определения структур, которые отображаются на аппаратные регистры. Есть несколько вещей, о которых следует помнить, если вы решите их использовать, один из них заключается в том, что вы не можете знать, как компилятор выполняет компоновку, упорядочивание и добавление в фактические байты, составляющие поля, и может отличаться среди компиляторов (и, возможно, с тем же компилятором, но с разными настройками оптимизации).

+0

В предложенной вами ссылке MSDN есть строка: * Обратите внимание, что nYear имеет длину 8 бит и переполняет границу слова объявленного типа unsigned int.Поэтому он начинается в начале нового беззнакового int. * Неправильно ли это объяснение в соответствии с рисунком выше? – zhangxaochen

6

Это определение битового поля.

Имя представляет собой целое число, способное хранить ровно 40 бит информации. Цвет может хранить 24 бита.

Это часто делается для того, чтобы сэкономить место в часто требуемых структурах или сжать код до размера, который легко обрабатывать для CPU (в вашем случае 64 бит. Fit точно в регистр CPU на 64-битной машине) ,

Код, который обращается к битовым полям, будет выполнять еще медленнее.

3

Use them judiciously:

Помните, что почти все о битовых полей является реализация зависит. Например, сохраняются ли биты слева направо или справа налево зависит от фактической архитектуры оборудования . Кроме того, каждый компилятор использует другой член модель выравнивания, поэтому размер оптимизированного BillingRec 12 байт, а не 9. Вы не можете взять адрес битового поля в не может создавать массивы битов. Наконец, в большинстве реализаций использование битовых полей несет накладные расходы на скорость. Поэтому, когда вы оптимизируете свой код, измерьте эффект определенной оптимизации и его компромиссы, прежде чем вы решите использовать .