From eed51be53ba3137dfcbf77a0d8f4ee9667ca5a80 Mon Sep 17 00:00:00 2001 From: Andreas Molzer Date: Sat, 18 Jan 2020 16:05:13 +0100 Subject: [PATCH] Switch to slice swapping for split The new slice is already initialized with default values for T due to the constructor used. Instead of using different defaulted values for replacing the split-off instances we can simply swap slices. This reduces pressure on the optimizer and uses a probably optimized method from the core library. --- src/arrayvec.rs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/arrayvec.rs b/src/arrayvec.rs index 608312c..3b86dd5 100644 --- a/src/arrayvec.rs +++ b/src/arrayvec.rs @@ -544,11 +544,10 @@ impl ArrayVec { } let mut new = Self::default(); let moves = &mut self.as_mut_slice()[at..]; - let targets = new.data.as_slice_mut(); - for (m, t) in moves.iter_mut().zip(targets) { - replace(t, replace(m, A::Item::default())); - } - new.len = self.len - at; + let split_len = moves.len(); + let targets = &mut new.data.as_slice_mut()[..split_len]; + moves.swap_with_slice(targets); + new.len = split_len; self.len = at; new }