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
相关产品推荐
相关产品推荐

