我编写了一个测试程序,以检查是否可以在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
答案 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);
}
}
了解更多: