为何TinyVec与Vec内存占用相同?Rust枚举Niche优化探究
关于TinyVec与Vec的Niche优化疑问
TinyVec 的定义如下:
pub enum TinyVec<A: Array> { #[allow(missing_docs)] Inline(ArrayVec<A>), #[allow(missing_docs)] Heap(Vec<A::Item>), }
运行以下代码会得到有趣的结果:
use tinyvec::*; fn main() { dbg!(std::mem::size_of::<Vec<u8>>()); dbg!(std::mem::size_of::<TinyVec<[u8; 13]>>()); dbg!(std::mem::size_of::<TinyVec<[u8; 14]>>()); dbg!(std::mem::size_of::<TinyVec<[u8; 15]>>()); dbg!(std::mem::size_of::<TinyVec<[u8; 16]>>()); }
输出结果:
[src/main.rs:4] std::mem::size_of::<Vec<u8>>() = 24 [src/main.rs:6] std::mem::size_of::<TinyVec<[u8; 13]>>() = 24 [src/main.rs:7] std::mem::size_of::<TinyVec<[u8; 14]>>() = 24 [src/main.rs:8] std::mem::size_of::<TinyVec<[u8; 15]>>() = 32 [src/main.rs:9] std::mem::size_of::<TinyVec<[u8; 16]>>() = 32
已知Rust可通过Niche优化减小枚举大小——将判别位存入变体未使用的内存空间或无效值中,但我不清楚这一机制对Vec<>是如何生效的。
Vec<>存在多种无效状态(如长度大于容量、数据指针为空且长度大于0等)可作为判别位,但这是Rust自动识别的,还是手动实现的Niche?
内容的提问来源于stack exchange,提问作者Timmmm
相关产品推荐
相关产品推荐

