Как объединить статические массивы в ржавчину? - PullRequest
0 голосов
/ 28 апреля 2019

У меня есть два статических массива u8, и я бы реализовал функцию для их объединения. Нечто подобное

fn concat_u8(first: &'static [u8], second: &'static [u8]) -> &'static [u8] {
    &[&first[..], &second[..]].concat()
}

Компилятор показывает мне ошибку returns a reference to data owned by the current function. Это потому, что выделенная память будет свободна в конце функции.

Как я могу "заставить" время жизни быть статичным?

Редактировать

У меня длительный процесс.

Во время запуска процесс обрабатывает некоторый ввод для вычисления результата (то есть функция concat_u8). В результате получается массив u8, который будет использоваться в остальной части жизненного цикла процесса только для чтения. Функция concat_u8 не может быть вызвана после «внутреннего события start».

Я бы не хотел использовать Box, потому что динамическое распределение подразумевает небольшие накладные расходы (может быть, не поддается измерению?) И сохраняет результат как &[u8].

Есть ли у меня шанс сделать это?

Могу ли я сделать это без использования блока unsafe?

1 Ответ

4 голосов
/ 28 апреля 2019

Невозможно объединить два среза в новый срез со статическим временем жизни без утечки памяти.

Срезы последовательно сохраняются в памяти.Конкатенация двух фрагментов со статическим временем жизни требует копирования их во вновь выделенную память, поскольку результат также должен быть последовательным.Эта вновь выделенная память обязательно будет принадлежать текущей функции, поэтому вы не можете вернуть ссылку на нее.

Вместо этого вам придется передать право владения памятью вызывающей стороне:

pub fn concat_u8(first: &[u8], second: &[u8]) -> Vec<u8> {
    [first, second].concat()
}

Нет необходимости требовать, чтобы у входов больше было статическое время жизни, и, вероятно, вообще не нужно реализовывать эту функцию, поскольку ее вызов не будет короче или понятнее, чем простое встраивание кода.

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