должен сначала аллоцировать на стеке, а потом уже в переносить в кучу?
// Memory allocated on heap (with temporary stack allocation in the process)
let foo = Box::new(*b"foo");
// Or, without the stack allocation, when box syntax stabilises:
let foo = box *b"foo";
учитывая, что box выкидывают, ага
взамен придумали Box::new_uninit, но пока всё самое интересное нестабилизировано, впрочем, через ансейф работает
скажем, такой код pub fn naïve<R: Rng, const N: usize>(r: &mut R) -> Box<[u8]> { let mut array = [0u8; N]; r.fill(&mut array[..]); Box::new(array) } для больших N приведёт к stack overflow, а pub fn maybe_uninit<R: Rng, const N: usize>(r: &mut R) -> Box<[u8]> { let mut array: Box<[MaybeUninit<u8>; N]> = Box::new( // See // https://doc.rust-lang.org/std/mem/union.MaybeUninit.html#initializing-an-array-element-by-element // for safety explanation. unsafe { MaybeUninit::uninit().assume_init() }); array.iter_mut().for_each(|x| { x.write(r.gen()); }); unsafe { transmute::<_, Box<[u8; N]>>(array) } } — отработает
Обсуждают сегодня