如何获取数组的引用而非切片?
如何获取数组的引用而非切片?
嘿,其实你写的代码里已经正确拿到数组的引用啦!你之所以会产生误解,主要是对mem::size_of_val的作用有点混淆~
先给你理清核心点:
- 你定义的
reference: &[u32; 4]确实是数组的引用,完全不是切片。切片的类型是&[u32](没有固定长度的动态视图),而数组引用的类型是&[u32; 4](明确标注了长度4),这俩在Rust里是完全不同的类型。 - 至于
mem::size_of_val返回的结果都是16,是因为这个函数的作用是返回被引用值的内存大小,而不是引用本身的大小。你的数组[u32;4]刚好是4个4字节的u32,加起来16字节——不管你用切片引用它还是数组引用它,指向的都是同一个16字节的数组,结果自然一模一样。
如果你想验证引用本身的大小,可以换用mem::size_of来查看类型的内存占用,修改下代码试试:
use std::mem; fn main() { let array: [u32; 4] = [1, 2, 3, 4]; let slice: &[u32] = &array[..]; let reference: &[u32; 4] = &array; // 查看引用类型自身的内存大小 println!("切片引用的大小: {:?}", mem::size_of::<&[u32]>()); // 64位系统下输出16(胖指针:地址+长度) println!("数组引用的大小: {:?}", mem::size_of::<&[u32;4]>()); // 64位系统下输出8(瘦指针:仅地址) // 而mem::size_of_val返回的是被指向的数组的大小 println!("切片指向的值大小: {:?}", mem::size_of_val(slice)); // 16 println!("数组引用指向的值大小: {:?}", mem::size_of_val(reference)); // 16 }
另外还有个小技巧能区分两者:数组引用可以隐式转换成切片(因为切片是数组的动态视图),但反过来切片不能直接转成数组引用——这也能直观证明它们是不同的类型:
// 合法:数组引用自动转为切片 let slice_from_ref: &[u32] = reference; // 不合法:切片无法直接转为固定长度的数组引用,需要额外处理 // let ref_from_slice: &[u32;4] = slice; // 编译报错
所以总结下:你原来的代码里reference变量就是你想要的数组引用,只是用错了工具函数来验证。换用mem::size_of查看引用类型自身的大小,就能看到切片是16字节的胖指针,而数组引用是8字节的瘦指针啦。
备注:内容来源于stack exchange,提问作者laprogrammer
相关产品推荐
相关产品推荐

