小编jv-*_*dev的帖子

如何安全地将Vec <f64>重新解释为Vec <num_complex :: Complex <f64 >>的一半大小?

我将复杂的数字数据填入Vec<f64>表格中的外部C库(不想改变),[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]记录的兼容.我想这样使用它而不需要重新分配潜在的大缓冲区.

我假设它是有效的使用from_raw_parts()std::vec::Vec假一新Vec,是以旧的所有权Vec的记忆(由不忘旧Vec),并使用size / 2capacity / 2,但是这需要不安全的代码.是否有一种"安全"的方式来进行这种数据重新解释?

Vec在Rust中作为a分配,Vec<f64>并由C函数.as_mut_ptr()填充使用填充的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 …
Run Code Online (Sandbox Code Playgroud)

unsafe rust

7
推荐指数
1
解决办法
163
查看次数

标签 统计

rust ×1

unsafe ×1