You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 06:10:34