从C ++ std :: vector <float>转换为Rust Vec <f32>的最佳方法是什么?

时间:2019-06-06 16:52:19

标签: c++ rust

我编写了一个测试程序,以检查是否可以在Rust上正确读取数据。

C ++代码:

std::vector<float> vec;
vec.push_back(10);
vec.push_back(20);
std::cout << "len is " << get_len(&vec);

锈迹代码:

#[no_mangle]
pub extern "C" fn get_len(vec: *const Vec<f32>) -> i32 {
    let vec= unsafe { &*vec};
    vec.len() as i32
}

我的输出看起来像这样,并且总是不同的:

len is 603268424

1 个答案:

答案 0 :(得分:9)

要知道的一件事是C ++不允许放弃数据向量的所有权。这是C ++设计的局限性。有一些tricks,但我不建议您使用它们。为了保持“安全”,您只能借用C ++向量。

使用vector::data()vector::size()可以轻松完成此操作:

#include <cstddef>
#include <vector>

extern "C" void show_vector(float const *data, std::size_t size);

int main() {
    std::vector<float> vec{10, 20};
    show_vector(vec.data(), vec.size());
}

Rust方可以使用slice::from_raw_parts(),从而在不获取所有权的情况下创建矢量视图。

use libc::{c_float, size_t};

extern "C" fn show_vector(data: *const c_float, size: size_t) {
    let vec = unsafe { std::slice::from_raw_parts(data, size) };
    for x in vec {
        println!("{}", x);
    }
}

了解更多: