From ae1e201a0cd37a48bd3dabf1c643ccd5f53f7680 Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Mon, 5 Aug 2019 17:50:44 +0200 Subject: [PATCH] Add a comment on the usage of Layout::new::>() --- src/liballoc/rc.rs | 2 ++ src/liballoc/sync.rs | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/liballoc/rc.rs b/src/liballoc/rc.rs index a9aa822173f..9d608c886b8 100644 --- a/src/liballoc/rc.rs +++ b/src/liballoc/rc.rs @@ -441,6 +441,8 @@ impl Rc<[T]> { #[unstable(feature = "new_uninit", issue = "63291")] pub fn new_uninit_slice(len: usize) -> Rc<[mem::MaybeUninit]> { let data_layout = Layout::array::>(len).unwrap(); + // This relies on `value` being the last field of `RcBox` in memory, + // so that the layout of `RcBox` is the same as that of `RcBox<()>` followed by `T`. let (layout, offset) = Layout::new::>().extend(data_layout).unwrap(); unsafe { let allocated_ptr = Global.alloc(layout) diff --git a/src/liballoc/sync.rs b/src/liballoc/sync.rs index 50fd9850893..1bd177be0d5 100644 --- a/src/liballoc/sync.rs +++ b/src/liballoc/sync.rs @@ -425,6 +425,8 @@ impl Arc<[T]> { #[unstable(feature = "new_uninit", issue = "63291")] pub fn new_uninit_slice(len: usize) -> Arc<[mem::MaybeUninit]> { let data_layout = Layout::array::>(len).unwrap(); + // This relies on `value` being the last field of `RcBox` in memory, + // so that the layout of `RcBox` is the same as that of `RcBox<()>` followed by `T`. let (layout, offset) = Layout::new::>().extend(data_layout).unwrap(); unsafe { let allocated_ptr = Global.alloc(layout) -- 2.44.0