2011-12-20 1 views
4

вот как вы объявляете битовый:Есть ли у битпонов какие-либо скрытые затраты или выгоды, кроме очевидной возможности экономии пространства?

unsigned m_bitfield1 : 2; // a bitfield that occupies 2 bits 
unsigned m_bitfield2 : 1; // a bitfield that occupies 1 bit 

битовое поле это просто небольшое поле, которое имеет определенный размер в битах.

Мой вопрос: могу ли я использовать свои собственные алгоритмы для обработки стандартных типов данных, таких как integer или float, которые занимают много ненужного пространства, поскольку коллекция меньших частей произвольного размера или использование бит-полей имеют некоторые скрытые преимущества? Спасибо.

ответ

9

Вполне возможно использовать ints как набор битов, к которым вы обращаетесь и управляете собой. Однако часто используются un-thought-of costs для использования генерируемых компилятором битовых полей (и, возможно, ваших собственных), о которых вы должны знать.

+1

Я безумно заблуждался в этом блоге на прошлой неделе и нашел его здесь по чистой случайности. Большое спасибо. – pmr

+0

@pmr: Я изменил название в надежде, что ваш безумный googling, скорее всего, найдет ответ в следующий раз. :-) – Omnifarious

6

Говорить, что бит-поля имеют некоторые скрытые преимущества, к сожалению, далеки от истины, по моему мнению, было бы лучше выразить скрытые недостатки их использования.


Чтобы ответить на ваш вопрос; да, конечно, вы можете написать свои собственные алгоритмы для обработки этих бит-полей произвольной длины как нечто совершенно другое.

Хотя нет способа получить длину поля m_bitfield1 (используя макрос или что-то еще), вам нужно будет отслеживать это самостоятельно.


Как примечание стороны нет ничего о том, что ниже структура будет 1 байт в размере:

struct Obj {unsigned bitfield1 : 3; unsigned bitfield2 : 5;}; // 8 bits total 

Это происходит из-за потенциального дополнения после структуры, а также между двумя если вам действительно не повезло.

С ++ Стандартный (Проект n1905): 9.6/1 Битовые поля

Распределение битовых полей внутри объекта класса определяется реализацией.

Выравнивание битовых полей определяется реализацией.


Чтение/Доступ к этим видам членов также может быть падение, большинство компиляторов сегодня могут оптимизировать эти инструкции, чтобы быть довольно быстро, хотя нет ничего о том, что это будет так, и это может создать много времени выполнения, если компилятор не думает так же, как и вы.


Порядок которой битовые поля будут появляться в памяти также определяется реализация, что может привести к непереносимой коде, который не может привести к одной и тем же вещам на два разных системах.

C++ Standard (проект n1905): 9,6/1 [Примечание: *] Битовые поля

битовых полей оседлать единиц распределения на некоторых машинах, а не на других.Бит-поля назначаются справа налево на некоторых машинах, слева направо на других.

Смежные вопросы