Учитывая функцию-прототип C:
int c_fn(void * out_param); //Write to out_param is successful if 0 is returned
Я хочу обернуть ее в функцию Rust, возвращающую Result
, вот так:
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 это лучший способ написать эту функцию?(С акцентом на производительность)