битовое поле структуры макс. размер (C99, C++)

Что такое максимальная разрядная ширина для разрядного поля структуры?

struct i { long long i:127;}

Я могу определить немного поля в структуре с размером битового поля до 128 битов или 256 битов, или больше? Существуют некоторые общедополнительные типы векторов, как (128-разрядный) sse2, avx1/avx2 (256-разрядные), avx-512 (512-разрядный для следующего Xeon Phis) регистры; и также расширения как __ int128 в gcc.

13
задан Deduplicator 26 December 2015 в 19:06
поделиться

4 ответа

C99 §6.7.2.1, параграф 3:

Выражение, определяющее ширину битового поля, должно быть целочисленным постоянным выражением , которое имеет {{1 }} неотрицательное значение, которое не должно превышать количество битов в объекте того типа, который указан, если двоеточие и выражение опущены . Если значение равно нулю, объявление не должно иметь декларатора.

C ++ 0xa §9.6, параграф 1:

... Константное выражение должно быть интегральным константным выражением со значением больше или равным нулю. { {1}} Значение выражения интегральной константы может быть больше, чем количество бит в объектном представлении (3.9) бит- тип поля; в таких случаях дополнительные биты используются как биты заполнения и не участвуют в представлении значения (3.9) битового поля .

Итак, в C вы вообще не можете этого сделать, а в C ++ он не будет делать то, что вы хотите.

20
ответ дан 1 December 2019 в 21:37
поделиться

Стандарт C ++ не устанавливает ограничений на размер битового поля, кроме того, что он должен быть больше или равен нулю - раздел 9.6 / 1. В нем также говорится:

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

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

Это, конечно, не означает, что ваша конкретная реализация компилятора поддерживает битовые поля произвольного размера.

3
ответ дан 1 December 2019 в 21:37
поделиться

Обычно вы не можете выделить больше бит, чем имеет базовый тип. Если long long составляет 64 бита, то ваше битовое поле, вероятно, ограничено: 64.

1
ответ дан 1 December 2019 в 21:37
поделиться

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

Редактировать:

Из спецификации C99:

6.7.2.1 Пуля 9:

Битовое поле интерпретируется как знаковый или беззнаковый целочисленный тип, состоящий из указанное количество бит.Если значение 0 или 1 сохраняется в битовом поле ненулевой ширины типа _Bool, значение битового поля должно сравниваться со значением {{ 1}} хранится.

6.7.2.1 Пункт 10:

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

1
ответ дан 1 December 2019 в 21:37
поделиться