Как я могу использовать отрицательное целочисленное значение дозорного без штрафа за память?

Я хотел бы портировать некоторый код C на Rust, который делает что-то похожее на указатели, допускающие значение NULL, но с положительными целыми числами. Отсутствующие данные в некоторых больших структурах данных представлены отрицательными целочисленными значениями в целом числе со знаком. Для основного значения доступен 31 бит, а то, что по сути является пустым вариантом перечисления, упаковано в бит знака.

В Rust есть оптимизация обнуляемых указателей, позволяющая делать что-то очень похожее с указателями.

Я мог бы сделать порт 1 к 1 и продолжать использовать для этого необработанные целые числа со знаком, но есть ли лучший способ, который не приводит к снижению производительности? Какой-то продвинутый намек на перечисление?


person Andrew Wagner    schedule 24.10.2018    source источник
comment
Когда вы говорите о снижении производительности, вы имеете в виду производительность памяти, верно?   -  person Boiethios    schedule 24.10.2018
comment
Вы должны иметь возможность использовать Option<NonZeroU32>, я думаю, что он был разработан специально для такой ситуации: doc.rust-lang.org/core/num/struct.NonZeroU32.html   -  person Tarmil    schedule 24.10.2018
comment
Я не верю, что это настоящий дубликат. NonZeroU32 делает что-то другое; добавление биекции (как предполагает ответ Матье) будет работать, но добавляет штраф за производительность.   -  person trentcl    schedule 24.10.2018
comment
Этот вопрос не является дубликатом. Ответ Матье - хороший ответ здесь, но не сработает на другой вопрос. Возможно, эти два вопроса можно объединить в один более общий, но в их нынешнем виде они разные.   -  person Sven Marnach    schedule 24.10.2018
comment
Изменение логики и возврат Option<> вместо использования Option<> является альтернативой для избежания штрафа за память. Поскольку это помечено как дублированное, см. здесь пример .   -  person attdona    schedule 24.10.2018


Ответы (1)