LINUX.ORG.RU

Битовые поля

 


0

1
struct Date {
   unsigned short nWeekDay  : 3;    // 0..7   (3 bits)
   unsigned short nMonthDay : 6;    // 0..31  (6 bits)
   unsigned short nMonth    : 5;    // 0..12  (5 bits)
   unsigned short nYear     : 8;    // 0..100 (8 bits)
};

А почему за использование таких вещей нужно убивать?


Ты же знаешь зачем это нужно, следственно понимаешь, что есть основания это использовать. Зачем тогда постить тупняк?

WitcherGeralt ★★
()
Ответ на: комментарий от WitcherGeralt

Я не понимала проблемы, пока мне тут не подсказали про big endian порядок.

Liz812
() автор топика

От bit fields подрогорало у очень даже более серьёзных дядек: https://lwn.net/Articles/478657/

И, если не ошибаюсь, сами создатели языка советовали не использовать их.

beastie ★★★★★
()

а union чем не подходит, как раз четыре char или один unsigned int?

Silerus ★★★★
()
Ответ на: комментарий от Liz812

Стандарт не указывает порядок, в котором биты пакуются в битовых полях. Это implementation-defined. Так получилось, что среди поддерживаемых ядром Linux архитектур порядок упаковки бит в битовых полях определяется порядком байт. Совпало, но вообще-то могло и не совпасть. Это раз.

А два заключается в том, что IP заголовок читается с помощью явного каста указателя на массив байт к указателю на структуру с последующим доступом к полям структуры. Такая штука называется алиасинг и вообще-то выходит за рамки определённые стандартом. Компилятор имеет право оптимизировать в предположении, что программист не нарушает стандарт. Поэтому ядро собирают с флагами, которые предотвращают такие оптимизации. Подобный подход вне ядра чреват шальными глюками.

i-rinat ★★★★★
()
Ответ на: комментарий от mos

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

roof ★★
()
Ответ на: комментарий от roof

То, что Лиза из интернета может оказаться Геннадием, не отменяет

унылого говноедного треда какого-то очередного хиккаря
который конечно не снесут нахер модеры

mos ★★☆☆☆
()
Ответ на: комментарий от Liz812

Ты тоже считаешь, что битовые операции с ручным подсчетом битов более простой и надежный способ?

Что такое «битовые поля с ручным подсчетом бито»? Я не понимаю такого термина.

Dudraug ★★★★★
()
Ответ на: комментарий от Dudraug

не понимаю как это связано с топиком. Для даты биты вообще не нужны

Так топик и не про дату (не для чего), а про битовые поля (посредством каких языковых возможностей): битовые поля v. маски/сдвиги и and/or/not.

bormant ★★★★★
()
Ответ на: комментарий от Liz812

Этот struct iphdr из include/uapi/linux/ip.h это как раз то, за что надо убивать. Этот хедер описывает userspace abi, а abi не должен зависеть от компилятора, поскольку userspace код могут собирать не таким компилятором, как ядро.

В общем битовые поля можно использовать внутри, выставлять битовые поля в публичный api нельзя, поскольку abi битовых полей зависит от желания левой пятки компилятора.

iliyap ★★★★★
()
Ответ на: комментарий от iliyap

а abi не должен зависеть от компилятора

Согласен. Все компиляторы на платформе должны следовать одному ABI.

userspace код могут собирать не таким компилятором, как ядро.

Не проблема, т.к. ABI не зависит от компилятора.
Компилятор зависит от принятого на платформе ABI.

utf8nowhere ★★★
()

Если это для внутрипрограммного использования, то это сомнительно с точки зрения быстродействия, но не более.

Т.е. в самой структуре ничего криминального нет вообще.

Убивать надо, если планируется эту структуру (да и вообще любые данные в бинарном виде) в сыром виде передавать по сети, какому-нибудь RS232/USB или писать в файл. Потому что на другой стороне может быть другая endianness

По-уму для этого надо использовать либо какой-нибудь текстовый формат, либо приводить все записываемые данные к единственной endianness (например network order), а при чтении - наоборот.

Stanson ★★★★★
()

А почему за использование таких вещей нужно убивать?

Как раз-таки нужно убивать за неиспользование таких вещей!

OnlyAsk
()

Чем тебе std::bitset не угодил, если уж так хочется с битами мучаться?

Siborgium ★★★★★
()

Какие же это битовые поля, если это тупо байты?

HIS
()
Ответ на: комментарий от crutch_master

Потому что для этого есть unix timestamp

яростно лорчую данного оратора

I-Love-Microsoft ★★★★★
()

Я так делаю, потому что у меня в контроллере всего 8000 16-битных энергонезависимых регистров, а хранить требуется 20 программ работы машины по 10 шагов в каждой (в каждом шаге по 10 числовых параметров), а ещё есть куча различных внутренних переменных, которые требуется запоминать. Приходится отводить под числа столько бит, сколько реально требуется для их представления. Поводов заниматься подобным онанизмом на компьютерах общего назначения не вижу.

Alden ★★★★
()
Последнее исправление: Alden (всего исправлений: 3)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.