РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
1193 of 1245 menu

Тип 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,
    который записывает значение без удаления старого
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить