给出C原型函数:
int c_fn(void * out_param); //Write to out_param is successful if 0 is returned
我希望将它包装在一个返回Result
的Rust函数中,如下所示:
extern crate libc;
use libc::{c_int, c_void};
use std::mem;
extern "C" {
/// Write to out_param is successful if 0 is returned
fn c_fn(out_param: *mut c_void) -> c_int;
}
enum Error {
SomeError,
}
fn call_c_fn<T>() -> Result<T, Error> {
let mut buf: T;
let ret = unsafe {
buf = mem::uninitialized();
c_fn(&mut buf as *mut _ as *mut c_void)
};
if ret == 0 {
return Ok(buf);
} else {
return Err(Error::SomeError);
}
}
我担心行return Ok(buf)
会不必要地复制buf
。我也担心打破返回值优化并在那里产生额外的副本。
是否有保证在此功能中可以进行零拷贝?有没有办法编写函数来获得保证?
澄清一下:在Rust的当前状态下,这是编写此函数的最佳方法吗? (关注绩效)