Максимальный размер битового поля struct (C99, С++) - программирование

Максимальный размер битового поля struct (C99, С++)

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

struct i { long long i:127;}

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

4b9b3361

Ответ 1

C99 §6.7.2.1, пункт 3:

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

С++ 0xa §9.6, пункт 1:

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

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

Ответ 2

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

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

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

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

Ответ 3

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

Ответ 4

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

Изменить:

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

6.7.2.1 Пуля 9:

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

6.7.2.1 Bullet 10:

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