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

Rust如何确定各类智能指针的大小?

Rust如何确定各类智能指针的大小?

嘿,这个问题我当初刚摸Rust的时候也纠结过!其实核心就看智能指针指向的类型是不是动态大小类型(DST),给你掰扯得明明白白:

  • 当智能指针(比如Box、Rc)指向的是**固定大小类型(Sized)**时,像u32这种编译时就知道确切大小的类型,智能指针本身就是个“瘦指针”——说白了就是存个目标数据的内存地址就行。在64位系统上,一个内存地址占8字节,所以Box<u32>、Rc<u32>的大小都是8字节,完全说得通对吧?

  • 可要是指向的是动态大小类型(DST),比如切片[T]、trait对象这类编译时没法确定大小的类型,那智能指针就得升级成“胖指针”了。胖指针里除了目标数据的起始地址,还得额外存一份DST的元数据:比如切片对应的就是它的长度,trait对象的话就是vtable指针。这样一来,64位系统里两个8字节的字段加起来,Box<[u8]>、Rc<[u8]>的大小就变成16字节了。

你可以跑这段代码验证下:

fn main() {
    println!("Size of Box<u32>: {} bytes", std::mem::size_of::<Box<u32>>());
    println!("Size of Rc<u32>: {} bytes", std::mem::size_of::<std::rc::Rc<u32>>());
    println!("Size of Box<[u8]>: {} bytes", std::mem::size_of::<Box<[u8]>>());
    println!("Size of Rc<[u8]>: {} bytes", std::mem::size_of::<std::rc::Rc<[u8]>>());
}

运行结果刚好和你观察到的一致:固定大小类型的智能指针是8字节,切片版本的是16字节。

总结下就是:智能指针的大小完全看它指向的类型属性——指向固定大小类型时是瘦指针(64位系统8字节),指向动态大小类型时就变成包含地址+元数据的胖指针(64位系统16字节)。

备注:内容来源于stack exchange,提问作者ViperZer0

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 17:33:06