Комментарии 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".
Я вообще не понял про что статья, про битовые операции? Про то что биты можно хранить в числе, но тогда нельзя с ними работать асинхронно?
Битовые поля в Rust