TinyVec
的定义为:
pub enum TinyVec<A: Array> {
#[allow(missing_docs)]
Inline(ArrayVec<A>),
#[allow(missing_docs)]
Heap(Vec<A::Item>),
}
但是,如果您运行此代码,您会得到有趣的结果(playground):
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可以使用"小众"来优化枚举大小--基本上它将判别式放在一些未使用的空间中,甚至是变量的未使用的值中.但我真的不明白它是如何做到这一点的.
肯定有一些Vec<>
的配置是无效的,因此可以用于判别式,例如大小和容量、空数据指针和大小以及0等等.但Rust真的足够聪明来解决这个问题,还是它是一个手工编码的利基市场?