реклама на сайте
подробности

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> Как сделать структуру из битовых полей минимального размера?
ViKo
сообщение Oct 1 2015, 08:58
Сообщение #16


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Похоже, битовое поле должно встраиваться в тот тип переменной, который указан. Если написали uint8_t, то, значит, в него.
Bool не катит, он может все 32 бита (int) оккупировать.
Go to the top of the page
 
+Quote Post
scifi
сообщение Oct 1 2015, 09:21
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(ViKo @ Oct 1 2015, 11:58) *
Похоже, битовое поле должно встраиваться в тот тип переменной, который указан.

Нет, не похоже. Во всяком случае, в тексте стандарта я этого не увидел. Более того, стандарт допускает, что битовое поле может наложиться на соседнее. Так что это абсолютно непереносимая штука.
Но я не йурист, если что...
Go to the top of the page
 
+Quote Post
ViKo
сообщение Oct 1 2015, 09:30
Сообщение #18


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(scifi @ Oct 1 2015, 12:21) *
Более того, стандарт допускает, что битовое поле может наложиться на соседнее.

Забить не полностью байт - это понимаю. Расположиться в двух соседних байтах - возможно. Добавляю дурных dummy битов на этот случай, для выравнивания. Но наложиться...? Это уж вряд ли.
Go to the top of the page
 
+Quote Post
scifi
сообщение Oct 1 2015, 09:41
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Фигню я сказал. Очевидно, имеется в виду, что битовое поле может лежать в двух разных ячейках (скажем, пересекать границу слова), а может размещаться в новой ячейке. На усмотрение компиляторописателя.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Oct 1 2015, 10:01
Сообщение #20


Гуру
******

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



QUOTE (scifi @ Oct 1 2015, 09:37) *
Короче, там почти ничего не определено стандартом. Битовые поля отданы на откуп компиляторописателям.

Но не замена ЯВНО указанного размера "юнита" int на восемь бит, как это делает по уверждению автора Борланд.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
scifi
сообщение Oct 1 2015, 10:29
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 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.

И нигде не сказано, что для битового поля будет выделена ячейка памяти, размер которой соответствует указанному типу. Ну просто нигде.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Oct 1 2015, 12:57
Сообщение #22


Гуру
******

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



QUOTE (scifi @ Oct 1 2015, 13:29) *
И нигде не сказано, что для битового поля будет выделена ячейка памяти, размер которой соответствует указанному типу. Ну просто нигде.

А то, что дефиниции int, без разбивки его на биты, размер выделяется "соответствующий указанному типу" и не может быть изменен компиляторописателями где-то написано? Нет?
А зачем тогда ВООБЩЕ тип указывается ("bit-field shall have a type") в такой структуре, если он по Вашему мнению ничего не должен значить? Я битовыми полями пользуюсь десятки лет и на десяках компиляторов и платформ. Да, уровень стандартизации невысок sad.gif, но на практике, при аккуратном четком описании структур, вылезает в реальности только порядк битов. Выделение явно указанному ТИПУ не его размера памяти есть чистый криминал.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
scifi
сообщение Oct 1 2015, 13:09
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 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".
Go to the top of the page
 
+Quote Post
zltigo
сообщение Oct 1 2015, 13:17
Сообщение #24


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
scifi
сообщение Oct 1 2015, 13:35
Сообщение #25


Гуру
******

Группа: Свой
Сообщений: 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.

По-моему, исчерпывающе. Никаких отсылок к размеру типа, используемого при объявлении битового поля. Можете возразить: "Да это же подразумевается, конечно!" На это я возражу, что если такие вещи будут подразумеваться, то и стандарт не нужен, всё ведь и так всем понятно и подразумевается.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Oct 1 2015, 13:47
Сообщение #26


Гуру
******

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



QUOTE (scifi @ Oct 1 2015, 16:35) *
Можете возразить: "Да это же подразумевается, конечно!"

Это НЕ подразумевается это ПРЯМО указывается указанием ТИПА этого самого '"storage unit".
QUOTE
Никаких отсылок к размеру типа, используемого при объявлении битового поля.

Если требование указания ТИПА "storage unit" , не есть такая "отсылка", то что-же это такое sm.gif Ну а то, что Вы процитировали это на самом деле СНЯТИЕ требования к компилятору паковать битовые поля из разных "storage unit" стык в стык, если количество биттов МЕНЬШЕ, чем задано типом "storage unit". Вот так просто.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
scifi
сообщение Oct 1 2015, 14:05
Сообщение #27


Гуру
******

Группа: Свой
Сообщений: 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.

Взято отсюда.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Oct 1 2015, 14:20
Сообщение #28


Гуру
******

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



QUOTE (scifi @ Oct 1 2015, 17:05) *
Кстати, с моей интерпретацией согласны пейсатели книг:

Я бы не приимал априори, что писатели книг умнее Вас sm.gif.



--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
scifi
сообщение Oct 1 2015, 14:52
Сообщение #29


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(zltigo @ Oct 1 2015, 17:20) *
Я бы не приимал априори, что писатели книг умнее Вас sm.gif.

Я также не принимал бы априори, что писатели книг глупее кого бы то ни было.

Кстати, а как насчёт техасских инструментов? Отсюда:
Цитата
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", то увидите, что с вашей интерпретацией никто не согласен. Сдавайтесь smile3009.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Oct 1 2015, 20:17
Сообщение #30


Гуру
******

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



QUOTE (scifi @ Oct 1 2015, 17:52) *
Кстати, получается, что стандарт C90 допускает только int, unsigned int, signed int для битовых полей, всё остальное не гарантируется.

Да, не требуется к реализации компилятором. Значит, если компилятор не поддерживает, то будет ругаться. Если поддерживаетт, а неподерживающих, например, тот-же char, встречать не приходилось, то будет вести себя соответствии с заданным типом.
QUOTE
то увидите, что с вашей интерпретацией никто не согласен. Сдавайтесь smile3009.gif

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



--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

3 страниц V  < 1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 23:06
Рейтинг@Mail.ru


Страница сгенерированна за 0.09936 секунд с 7
ELECTRONIX ©2004-2016