如何将f64数组重新解释为f64元素的元组



我有一个代码生成器,它生成对返回Vec<f64>的函数的调用。我需要将这些值分配到一组变量中,最好的方法似乎是这些变量的元组。类似这样的东西:

let array: &[f64] = &my_function(3);
let (a, b, c): (f64, f64, f64) = unsafe { std::mem::transmute(*array) };

操场(无法计算(

我不知道如何编写不安全的部分以使它被编译器接受。

我更喜欢避免生成按项目分配的项目,因为性能在这里非常重要。

这能做到吗?元组的内存布局是否与数组兼容?

您不能这样做,句号;元组没有保证的内存布局,因此您无法从可能匹配也可能不匹配的东西转换。

我会做正常的模式匹配:

fn main() {
    let values = my_function(3);
    dbg!(&values);
    let (a, b, c) = match &*values {
        [a, b, c] => (a, b, c),
        _ => panic!(),
    };
    dbg!(a, b, c);
}
fn my_function(count: usize) -> Vec<f64> {
    vec![3.14_0f64; count]
}

另请参阅:

  • 结构、元组和元组结构的内存布局是什么
  • 如何将引用的元组转换为元组的引用
  • 是否可以使用泛型的类型参数来控制数组的大小

使用const泛型和允许来回转换数组的新功能:

fn main() {
    let array = my_function::<3>();
    let (a, b, c): (f64, f64, f64) = array.into();
}
fn my_function<const N: usize>() -> [f64; N] {
    [0.0; N]
}

最新更新