Enums 如何使用负整数sentinel值而不导致内存损失?
我想把一些C代码移植到Rust,它做的事情类似于可空指针,但带有正整数。某些大型数据结构中的缺失数据用带符号整数中的负整数值表示。31位可用于主值,本质上是空枚举变量的内容被打包到符号位中 Rust具有可空指针优化功能,可以对指针执行非常类似的操作Enums 如何使用负整数sentinel值而不导致内存损失?,enums,rust,nullable,sentinel,Enums,Rust,Nullable,Sentinel,我想把一些C代码移植到Rust,它做的事情类似于可空指针,但带有正整数。某些大型数据结构中的缺失数据用带符号整数中的负整数值表示。31位可用于主值,本质上是空枚举变量的内容被打包到符号位中 Rust具有可空指针优化功能,可以对指针执行非常类似的操作 我可以使用1对1端口,并继续使用原始有符号整数,但有没有更好的方法不会导致性能损失?某种高级enum repr提示?正如@Tarmil在评论中提到的,这正是的用例 编译器知道非零u32永远不会是0,因此选项是4个字节,就像常规的u32一样 当0是您的
我可以使用1对1端口,并继续使用原始有符号整数,但有没有更好的方法不会导致性能损失?某种高级enum repr提示?正如@Tarmil在评论中提到的,这正是的用例 编译器知道
非零u32
永远不会是0,因此选项
是4个字节,就像常规的u32
一样
当0是您的有效值时,最好将选项
包装在您自己的类型中,该类型在域值和[1..2^32-1]
域之间执行双射:
- 当接收到负值时,将字段设置为
None
- 收到正值时,加1(读取时减1)
因为您的值最初是有符号的,所以添加1时没有溢出的风险,所以没有问题。当您说“性能惩罚”时,您的意思是“内存性能”,对吗?您应该能够使用
选项,我认为它是专为这种情况设计的:我不相信这是真正的重复<代码>非零U32
做了一些不同的事情;添加双射(如Matthieu的回答所示)会起作用,但会增加性能损失。这个问题不是重复的。Matthieu的答案在这里是一个很好的答案,但在另一个问题上不起作用。也许可以将这两个问题合并成一个更一般的问题,但就目前的情况而言,它们是不同的。“颠倒”逻辑并返回选项而不是使用选项
,是避免记忆惩罚的另一种选择。因为对于一个示例,这被标记为重复。