Тип MaybeUninit
Тип MaybeUninit представляет собой обёртку,
которая может содержать значение типа T,
но не отслеживает, было ли это значение инициализировано.
Он используется для работы с памятью, которая ещё
не содержит валидного значения, что позволяет избежать
преждевременной инициализации и связанных с ней затрат.
Параметром тип принимает обобщённый тип T,
для которого создаётся контейнер неинициализированного значения.
Синтаксис
std::mem::MaybeUninit<T>
Пример
Давайте создадим неинициализированное значение типа i32
и затем запишем в него число 12345:
use std::mem::MaybeUninit;
fn main()
{
let mut value: MaybeUninit<i32> = MaybeUninit::uninit();
value.write(12345);
let res = unsafe { value.assume_init() };
println!("{}", res);
}
Результат выполнения кода:
12345
Пример
Давайте создадим неинициализированный массив из пяти элементов
типа i32 и инициализируем каждый элемент отдельно:
use std::mem::MaybeUninit;
fn main()
{
let mut arr: [MaybeUninit<i32>; 5] = unsafe {
MaybeUninit::uninit().assume_init()
};
for i in 0..5 {
arr[i].write(i as i32 * 10);
}
let res: [i32; 5] = unsafe {
std::mem::transmute(arr)
};
println!("{:?}", res);
}
Результат выполнения кода:
[0, 10, 20, 30, 40]
Пример
Давайте создадим значение типа MaybeUninit
с уже инициализированным числом 12345
при помощи метода new:
use std::mem::MaybeUninit;
fn main()
{
let value: MaybeUninit<i32> = MaybeUninit::new(12345);
let res = unsafe { value.assume_init() };
println!("{}", res);
}
Результат выполнения кода:
12345
Смотрите также
-
ключевое слово
unsafe,
которое открывает доступ к небезопасным операциям -
метод
uninit,
который создаёт неинициализированное значение -
метод
assume_init,
который извлекает инициализированное значение -
метод
write,
который записывает значение без удаления старого