Как стать автором
Поиск
Написать публикацию
Обновить

Комментарии 8

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

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

Полагаю, это вообще не проблема, поскольку базовые механизмы работы с битами предоставлены, и далее просто уже подключаешь любимую библиотеку — и вперёд.

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

Ну, из практики, нужен не только repr(С).

Для сетевых протоколов, где, например, 32 битное что-то может следовать в стык сразу после 8битного - без выравнивания. Тут без packed не обойтись - ни в С ни в Rust. Так что вот еще вам в копилку #[repr(packed)]

и реально еще и repr(align(n)) тоже может потребоваться там где выравнивания нужны для производительности, чтобы элементы структуры, в которых, например атомики, или длинные целые были в разных элементах кеша процессора.

да и в биты можно паковать через repr(u*)/repr(i*) , да и вроде где-то RFC на честные bitfields как в сишке был, правда не знаю какой у неё статус.

[repr(packed)], да, как -то делал на расте, так потом компилятор не даёт ЧИТАТЬ из полей структуры, типа они у тебя лежат по невыровненному адресу, заведи временную переменную, скопируй из поля значение и уже работай с ним.

Дико неудобно, в итоге создал две структуры, одна [repr(packed)] для сериализации/десериализации, другая обычная. Возможно, финальная версия кода была переписана с использованием библиотеки https://github.com/bincode-org/bincode

Битовые поля в Rust

Кажется, название статьи некорректно: про битовые поля (в понимании С - элементы данных, размером не кратные байту), тут ничего нет.
Правильнее было бы назвать "Битовые операции в Rust".

Я вообще не понял про что статья, про битовые операции? Про то что биты можно хранить в числе, но тогда нельзя с ними работать асинхронно?

Зарегистрируйтесь на Хабре, чтобы оставить комментарий