Что такое максимальная разрядная ширина для разрядного поля структуры?
struct i { long long i:127;}
Я могу определить немного поля в структуре с размером битового поля до 128 битов или 256 битов, или больше? Существуют некоторые общедополнительные типы векторов, как (128-разрядный) sse2, avx1/avx2 (256-разрядные), avx-512 (512-разрядный для следующего Xeon Phis) регистры; и также расширения как __ int128 в gcc.
C99 §6.7.2.1, параграф 3:
Выражение, определяющее ширину битового поля, должно быть целочисленным постоянным выражением , которое имеет {{1 }} неотрицательное значение, которое не должно превышать количество битов в объекте того типа, который указан, если двоеточие и выражение опущены . Если значение равно нулю, объявление не должно иметь декларатора.
C ++ 0xa §9.6, параграф 1:
... Константное выражение должно быть интегральным константным выражением со значением больше или равным нулю. { {1}} Значение выражения интегральной константы может быть больше, чем количество бит в объектном представлении (3.9) бит- тип поля; в таких случаях дополнительные биты используются как биты заполнения и не участвуют в представлении значения (3.9) битового поля .
Итак, в C вы вообще не можете этого сделать, а в C ++ он не будет делать то, что вы хотите.
Стандарт C ++ не устанавливает ограничений на размер битового поля, кроме того, что он должен быть больше или равен нулю - раздел 9.6 / 1. В нем также говорится:
Битовые поля упакованы в некоторую адресуемую единицу распределения. [Примечание: блоки распределения битовых полей на некоторых машинах, но не на других. Битовые поля назначаются справа налево на некоторых машинах , слева направо на других. ]
Что, я полагаю, можно рассматривать как указание на какой-то максимальный размер.
Это, конечно, не означает, что ваша конкретная реализация компилятора поддерживает битовые поля произвольного размера.
Обычно вы не можете выделить больше бит, чем имеет базовый тип. Если long long
составляет 64 бита, то ваше битовое поле, вероятно, ограничено: 64.
Поскольку значения битовых полей присваиваются целым числам, я предполагаю, что наибольшее значение битового поля вы можно использовать размер intmax_t.
Редактировать:
Из спецификации C99:
6.7.2.1 Пуля 9:
Битовое поле интерпретируется как знаковый или беззнаковый целочисленный тип, состоящий из указанное количество бит.Если значение 0 или 1 сохраняется в битовом поле ненулевой ширины типа _Bool, значение битового поля должно сравниваться со значением {{ 1}} хранится.
6.7.2.1 Пункт 10:
Реализация может выделить любую адресуемую единицу хранения, достаточно большую для хранения битового поля. Если остается достаточно места , битовое поле, которое сразу следует за другим битовым полем в структуре , должно быть упаковано в соседние биты той же единицы. Если недостаточно места, то вопрос о том, помещается ли неподходящее битовое поле в следующий блок или перекрывает соседние блоки, определяется реализацией. Порядок распределения битовых полей внутри блока (от высокого до низкого или от низкого до высокого) - это реализация -определенный. Выравнивание адресуемой единицы хранения не указано.