我有一个代码生成器,它生成对返回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]
}