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

如何获取数组的引用而非切片?

如何获取数组的引用而非切片?

嘿,其实你写的代码里已经正确拿到数组的引用啦!你之所以会产生误解,主要是对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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 10:18:07