#value #type #primitive #minimum-maximum

nonminmax

不能是其最小/最大值的原始类型

2 个版本

0.1.1 2020年6月23日
0.1.0 2020年6月22日

#2524 in Rust 模式

MIT 许可证

1MB
225

包含 (WOFF 字体, 190KB) doc/FiraSans-Medium.woff, (WOFF 字体, 185KB) doc/FiraSans-Regular.woff, (WOFF 字体, 94KB) doc/SourceSerifPro-Bold.ttf.woff, (WOFF 字体, 89KB) doc/SourceSerifPro-Regular.ttf.woff, (WOFF 字体, 56KB) doc/SourceCodePro-Regular.woff, (WOFF 字体, 56KB) doc/SourceCodePro-Semibold.woff 和更多

不能是其最小/最大值的整数类型。

GitHub Workflow Status Crates.io Rustdoc GitHub

标准库包含一组 std::num::NonZeroX 类型:不能为零的整数类型。这个crate通过提供 NonMinX/NonMaxX 来进一步扩展这一概念:不能是其最小/最大值的整数类型。

// Create a regular NonMinU32
let x = 123 as i32;
let y = NonMinI32::new(x).unwrap();
assert_eq!(y.get(), 123);

// -2147483648 is the minimum value for a 32-bit integer.
let z = NonMinI32::new(-2147483648);
assert_eq!(z, None);

内存优化

NonZeroX 类型类似,这些 NonMinX/NonMaxX 类型允许进行利基填充优化。这意味着类型如 Option<NonMinX>/Option<NonMaxX> 占用的空间与 X 相同,而一个常规的 Option<X> 由于需要存储变体标记,占用的空间是 X 的两倍。

// Option<u32> is larger than a regular u32
assert!(size_of::<Option<u32>>() == 2 * size_of::<u32>());

// Option<NonMinU32>/Option<NonMaxU32> is the same size as a regular u32.
assert!(size_of::<Option<NonMinU32>>() == size_of::<u32>());
assert!(size_of::<Option<NonMaxU32>>() == size_of::<u32>());

虽然这看起来像是一个微优化,但当频繁传递 Option<X> 或创建大量 Option<X> 数组时,它变得很重要。

// 1000 x u32 takes up 4000 bytes
assert!(size_of::<[u32; 1000]>() == 4000);

// 1000 x Option<u32> takes up 8000 bytes, ouch
assert!(size_of::<[Option<u32>; 1000]>() == 8000);

// 1000 x Option<NonMaxU32> takes up only 4000 bytes
assert!(size_of::<[Option<NonMaxU32>; 1000]>() == 4000);

内部细节

内部,这些类型通过包装现有的 NonZeroX 类型并在访问内部值时使用掩码进行异或操作来工作。这意味着每次调用 get 时,都会有一个 xor 指令的开销。

支持的类型

以下类型受到支持

  • i8/u8
  • i16/u16
  • i32/u32
  • i64/u64
  • i128 / u128
  • isize / usize

无运行时依赖