Enums 如何使用负整数sentinel值而不导致内存损失?

Enums 如何使用负整数sentinel值而不导致内存损失?,enums,rust,nullable,sentinel,Enums,Rust,Nullable,Sentinel,我想把一些C代码移植到Rust,它做的事情类似于可空指针,但带有正整数。某些大型数据结构中的缺失数据用带符号整数中的负整数值表示。31位可用于主值,本质上是空枚举变量的内容被打包到符号位中 Rust具有可空指针优化功能,可以对指针执行非常类似的操作 我可以使用1对1端口,并继续使用原始有符号整数,但有没有更好的方法不会导致性能损失?某种高级enum repr提示?正如@Tarmil在评论中提到的,这正是的用例 编译器知道非零u32永远不会是0,因此选项是4个字节,就像常规的u32一样 当0是您的

我想把一些C代码移植到Rust,它做的事情类似于可空指针,但带有正整数。某些大型数据结构中的缺失数据用带符号整数中的负整数值表示。31位可用于主值,本质上是空枚举变量的内容被打包到符号位中

Rust具有可空指针优化功能,可以对指针执行非常类似的操作


我可以使用1对1端口,并继续使用原始有符号整数,但有没有更好的方法不会导致性能损失?某种高级enum repr提示?

正如@Tarmil在评论中提到的,这正是的用例

编译器知道
非零u32
永远不会是0,因此
选项
是4个字节,就像常规的
u32
一样

当0是您的有效值时,最好将
选项
包装在您自己的类型中,该类型在域值和
[1..2^32-1]
域之间执行双射:

  • 当接收到负值时,将字段设置为
    None
  • 收到正值时,加1(读取时减1)

因为您的值最初是有符号的,所以添加1时没有溢出的风险,所以没有问题。

当您说“性能惩罚”时,您的意思是“内存性能”,对吗?您应该能够使用
选项,我认为它是专为这种情况设计的:我不相信这是真正的重复<代码>非零U32
做了一些不同的事情;添加双射(如Matthieu的回答所示)会起作用,但会增加性能损失。这个问题不是重复的。Matthieu的答案在这里是一个很好的答案,但在另一个问题上不起作用。也许可以将这两个问题合并成一个更一般的问题,但就目前的情况而言,它们是不同的。“颠倒”逻辑并返回
选项而不是使用
选项
,是避免记忆惩罚的另一种选择。因为对于一个示例,这被标记为重复。