Как стать автором
Обновить

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

Вопрос если кто в теме.

В C часто используется трюк с добавлением новых полей в структуру и таким образом старый код продолжает работать как ни в чём не бывало.

С Rust такое не пройдёт если конечно не объявлять структуру как repr(C).

То есть нужно будет всё перекомпилировать при добавлении нового поля.

А есть ли варианты получше где не надо будет все зависимости собирать заново ?

Для enum и struct есть #[non_exhaustive].

Но и в С нужно особым образом писать код, чтобы добавление нового поля ничего не сломало. Лучше использовать кодогенерацию для разных версий API.

особым да, но ничего такого усложнённого.

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

Ну и что будет делать старый код с новой версией? Этот подход вообще перпендикулярен "трюк с добавлением новых полей в структуру", т.к. на каждую версию пишется/генерится отдельный код парсинга.

Я почитал бы как хранится в памяти Option и Result. Вроде, там есть хитрые оптимизации при ненулевом указателе.

При указателе который NonNull.

В противном случае ноль будет являться валидными значением и оптимизации не будет.

А ещё есть числа без ноля , которые также позволяют сэкономить.

https://doc.rust-lang.org/std/ptr/struct.NonNull.html

https://doc.rust-lang.org/std/num/index.html

Какое ещё выравнивание может быть у битов, неоднократно встречающееся в тексте? В разговорах о data alignment речь может вестись только об адресуемых сущностях. Назовите хотя бы одну архитектуру, пусть даже экспериментальную, в которой адрес есть у каждого отдельного бита в слове. А пока мы можем говорить только о тех единицах информации, которыми оперирует конкретный процессор — обычно это байты, слова, двойные и четверные слова, Важно при этом не только не путать их с конкретными типами в том или ином языке программирования, но и чётко понимать, как эти ЯВУ-типы отображаются на реальные процессорные объекты. Незнакомый с Rust знаток C вполне может наивно полагать, что char — это один байт в памяти, что почти всегда верно для C, и никогда — для Rust.

В том числе и поэтому разговоры о выравнивании почти бесполезны в отрыве от целевой архитектуры. Например, для какого-нибудь i8080 все эти выравнивания, что мёртвому припарка, поскольку время выборки байта по любому адресу — константа; на x86 слово по нечётному адресу будет добываться дольше, чем по чётному; а на LSI-11 эта же ситуация — “дёрнуть” слово по нечётному адресу, просто вызывает trap. На любом суперкомпьютере или на той же популярнейшей архитектуре amd64 необходимо учитывать даже конкретную модель процессора — два Core i7 могут быть ощутимо разными процессорами самым неочевидным для программиста образом. Хотя бы из-за разницы в размерах и организации кэшей. В результате смены процессора вся безопасность thread-safe data structures может рассыпаться, если на конкретном варианте процессора оно вдруг перестало влезать в cache row.

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