我有一些复数数据,由外部C库(不希望更改)填充到一个
Vec<f64>
中,形式为 [i_0_real, i_0_imag, i_1_real, i_1_imag, ...]
,该 Vec<f64>
似乎具有与 Vec<num_complex::Complex<f64>>
相同的内存布局,而后者长度减半,因为 num_complex::Complex<f64>
的数据结构与 [f64; 2]
兼容,并在此处文档中记录。我想这样使用它,而不需要重新分配可能很大的缓冲区。
我假设可以在 std::vec::Vec
中使用 from_raw_parts()
来模拟一个新的 Vec
,它接管旧 Vec
的内存(通过遗忘旧的 Vec
),并使用 size / 2
和 capacity / 2
,但这需要不安全的代码。是否有“安全”的方法来执行这种数据重新解释?
Vec
在 Rust 中被分配为 Vec<f64>
,并通过使用 .as_mut_ptr()
的 C 函数来填充 Vec<f64>
。
我当前编译的不安全实现:
extern crate num_complex;
pub fn convert_to_complex_unsafe(mut buffer: Vec<f64>) -> Vec<num_complex::Complex<f64>> {
let new_vec = unsafe {
Vec::from_raw_parts(
buffer.as_mut_ptr() as *mut num_complex::Complex<f64>,
buffer.len() / 2,
buffer.capacity() / 2,
)
};
std::mem::forget(buffer);
return new_vec;
}
fn main() {
println!(
"Converted vector: {:?}",
convert_to_complex_unsafe(vec![3.0, 4.0, 5.0, 6.0])
);
}
f64
不是一个复数。 - Stargateur