From c38efd050449a347785b90c96a9c84dedefefde2 Mon Sep 17 00:00:00 2001 From: Nilstrieb <48135649+Nilstrieb@users.noreply.github.com> Date: Thu, 22 Feb 2024 19:00:33 +0100 Subject: [PATCH] avoid check in vec deref --- library/alloc/src/vec/mod.rs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/library/alloc/src/vec/mod.rs b/library/alloc/src/vec/mod.rs index 08e3cdedc666b..eeff6fd2b50b0 100644 --- a/library/alloc/src/vec/mod.rs +++ b/library/alloc/src/vec/mod.rs @@ -2703,7 +2703,11 @@ impl ops::Deref for Vec { #[inline] fn deref(&self) -> &[T] { - unsafe { slice::from_raw_parts(self.as_ptr(), self.len) } + // slice::from_raw_parts brings in an unsafe precondition check which we want to avoid + // here in this really hot functions. To forge an invalid pointer, users basically need + // to transmute to pass an unaligned pointer to from_raw_parts (WHICH SHOULD BE DETECTED THERE, FIXME). + // So the cost-benefit of this check leans towards not having it. + unsafe { &*ptr::slice_from_raw_parts(self.as_ptr(), self.len) } } } @@ -2711,7 +2715,8 @@ impl ops::Deref for Vec { impl ops::DerefMut for Vec { #[inline] fn deref_mut(&mut self) -> &mut [T] { - unsafe { slice::from_raw_parts_mut(self.as_mut_ptr(), self.len) } + // See deref. + unsafe { &mut *ptr::slice_from_raw_parts_mut(self.as_mut_ptr(), self.len) } } }