2 个版本
0.1.1 | 2020年6月23日 |
---|---|
0.1.0 | 2020年6月22日 |
#2524 in Rust 模式
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 和更多。
不能是其最小/最大值的整数类型。
标准库包含一组 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