Есть ли способ написать функцию, гарантирующую, что будет возвращено ноль копий возвращаемого значения? - PullRequest
0 голосов
/ 26 мая 2018

Учитывая функцию-прототип 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 это лучший способ написать эту функцию?(С акцентом на производительность)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...