|
|
  |
Как сделать структуру из битовых полей минимального размера? |
|
|
|
Oct 1 2015, 10:29
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(zltigo @ Oct 1 2015, 13:01)  Но не замена ЯВНО указанного размера "юнита" int на восемь бит, как это делает по уверждению автора Борланд. Пруф? Я утверждаю обратное. Там даже вот такое есть: Цитата A bit-field shall have a type that is a qualified or unqualified version of_Bool, signed int,unsigned int, or some other implementation-defined type. И нигде не сказано, что для битового поля будет выделена ячейка памяти, размер которой соответствует указанному типу. Ну просто нигде.
|
|
|
|
|
Oct 1 2015, 12:57
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (scifi @ Oct 1 2015, 13:29)  И нигде не сказано, что для битового поля будет выделена ячейка памяти, размер которой соответствует указанному типу. Ну просто нигде. А то, что дефиниции int, без разбивки его на биты, размер выделяется "соответствующий указанному типу" и не может быть изменен компиляторописателями где-то написано? Нет? А зачем тогда ВООБЩЕ тип указывается ("bit-field shall have a type") в такой структуре, если он по Вашему мнению ничего не должен значить? Я битовыми полями пользуюсь десятки лет и на десяках компиляторов и платформ. Да, уровень стандартизации невысок  , но на практике, при аккуратном четком описании структур, вылезает в реальности только порядк битов. Выделение явно указанному ТИПУ не его размера памяти есть чистый криминал.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Oct 1 2015, 13:09
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(zltigo @ Oct 1 2015, 15:57)  А то, что дефиниции int, без разбивки его на биты, размер выделяется "соответствующий указанному типу" и не может быть изменен компиляторописателями где-то написано? Нет? Написано: Цитата A "plain" int object has the natural size suggested by the architecture of the execution environment (large enough to contain any value in the range INT_MIN to INT_MAX as defined in the header <limits.h>). Цитата(zltigo @ Oct 1 2015, 15:57)  А зачем тогда ВООБЩЕ тип указывается ("bit-field shall have a type") в такой структуре, если он по Вашему мнению ничего не должен значить? ИМХО, только чтобы различать целое и bool. Ну и знак, естественно. Во всяком случае, из стандарта это следует. Другое дело, что вот это всё "implementation-defined" позволяет использовать размер целого типа как указание компилятору, какими кусками выделять память под битовые поля. Но, повторюсь, это "implementation-defined".
|
|
|
|
|
Oct 1 2015, 13:17
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (scifi @ Oct 1 2015, 16:09)  ИМХО, только чтобы различать целое и bool Глупость. Хотя-бы по той железобетонной причине, что битовые поля существовали в стандарте тогда, когда никакого _Bool, как нативного типа, и близко не было и различать было просто нечего. QUOTE Написано: Цитата A "plain" int object has the natural size suggested by the architecture of the execution environment (large enough to contain any value in the range INT_MIN to INT_MAX as defined in the header <limits.h>). Наверное Вы что-то пропустили в цитате, ибо я что-то не увидел, что int допускается в структурах содержащих битовые поля МОЖНО выделять МЕНЬШЕ памяти, чем требуется для INT_MAX? Или такого не написано? Тогда к чему цитата?
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Oct 1 2015, 13:35
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(zltigo @ Oct 1 2015, 16:17)  Наверное Вы что-то пропустили в цитате, ибо я что-то не увидел, что int допускается в структурах содержащих битовые поля МОЖНО выделять МЕНЬШЕ памяти, чем требуется для INT_MAX? Или такого не написано? Тогда к чему цитата? Написано, вы просто не стали читать. Напишу снова: Цитата An implementation may allocate any addressable storage unit large enough to hold a bit-field. По-моему, исчерпывающе. Никаких отсылок к размеру типа, используемого при объявлении битового поля. Можете возразить: "Да это же подразумевается, конечно!" На это я возражу, что если такие вещи будут подразумеваться, то и стандарт не нужен, всё ведь и так всем понятно и подразумевается.
|
|
|
|
|
Oct 1 2015, 13:47
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (scifi @ Oct 1 2015, 16:35)  Можете возразить: "Да это же подразумевается, конечно!" Это НЕ подразумевается это ПРЯМО указывается указанием ТИПА этого самого '"storage unit". QUOTE Никаких отсылок к размеру типа, используемого при объявлении битового поля. Если требование указания ТИПА "storage unit" , не есть такая "отсылка", то что-же это такое  Ну а то, что Вы процитировали это на самом деле СНЯТИЕ требования к компилятору паковать битовые поля из разных "storage unit" стык в стык, если количество биттов МЕНЬШЕ, чем задано типом "storage unit". Вот так просто.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Oct 1 2015, 14:05
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Ну что ж, можно констатировать, что есть как минимум два мнения о том, что имелось в виду. Надо править текст стандарта, чтобы двух мнений не было. Кстати, с моей интерпретацией согласны пейсатели книг: Цитата Container size - If packing and straddling is not an issue, does the compiler reliably place a bit field within a container of the user-specified size? We cannot be sure, since the Spec. says an implementation can use "any addressable storage unit large enough" to accomodate the bit field. Взято отсюда.
|
|
|
|
|
Oct 1 2015, 14:52
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(zltigo @ Oct 1 2015, 17:20)  Я бы не приимал априори, что писатели книг умнее Вас  . Я также не принимал бы априори, что писатели книг глупее кого бы то ни было. Кстати, а как насчёт техасских инструментов? Отсюда: Цитата The declared type of a bit-field is the type that appears in the source code. To hold the value of a bit-field, the C and C++ standards allow an implementation to allocate any addressable storage unit large enough to hold it, which need not be related to the declared type. The addressable storage unit is commonly called the container type, and that is how we refer to it in this document. The container type is the major determinant of how bit-fields are packed and aligned. C89, C99, and C++ have different requirements for the declared type: C89 int, unsigned int, signed int C99 int, unsigned int, signed int, _Bool, or "some other implementation-defined type" C++ any integral or enumeration type, including bool Кстати, получается, что стандарт C90 допускает только int, unsigned int, signed int для битовых полей, всё остальное не гарантируется. У меня под рукой нет текста C90, но охотно верю. И вообще, если пошерстите гугл на предмет "any addressable storage unit", то увидите, что с вашей интерпретацией никто не согласен. Сдавайтесь
|
|
|
|
|
Oct 1 2015, 20:17
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (scifi @ Oct 1 2015, 17:52)  Кстати, получается, что стандарт C90 допускает только int, unsigned int, signed int для битовых полей, всё остальное не гарантируется. Да, не требуется к реализации компилятором. Значит, если компилятор не поддерживает, то будет ругаться. Если поддерживаетт, а неподерживающих, например, тот-же char, встречать не приходилось, то будет вести себя соответствии с заданным типом. QUOTE то увидите, что с вашей интерпретацией никто не согласен. Сдавайтесь  Не собираюсь ни шерстить ни сдаваться. Прична проста - компиляторы работают в согласии со мной, но главное, в согласии с наличием в стандарте указания типа. Поведение понятно и оно устраивает.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|