Skip to content

Commit 4aa913c

Browse files
committed
Auto merge of rust-lang#32012 - bluss:more-drop-in-place, r=alexcrichton
Use `drop_in_place` in Vec and VecDeque We can use drop_in_place's DST capabilities directly in Vec::drop and similarly in VecDeque::drop. I verfied this has the same effect as the previous `needs_drop` code; `drop_in_place` it itself an intrinsic. The VecDeque replacement should be more efficient too, even in release mode (slice iteration makes a more efficient loop than the deque iterator).
2 parents 7cee8b9 + 7ceafae commit 4aa913c

File tree

2 files changed

+13
-12
lines changed

2 files changed

+13
-12
lines changed

src/libcollections/vec.rs

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ use borrow::ToOwned;
6666
use core::cmp::Ordering;
6767
use core::fmt;
6868
use core::hash::{self, Hash};
69-
use core::intrinsics::{arith_offset, assume, needs_drop};
69+
use core::intrinsics::{arith_offset, assume};
7070
use core::iter::FromIterator;
7171
use core::mem;
7272
use core::ops::{Index, IndexMut};
@@ -497,10 +497,11 @@ impl<T> Vec<T> {
497497
unsafe {
498498
// drop any extra elements
499499
while len < self.len {
500-
// decrement len before the read(), so a panic on Drop doesn't
501-
// re-drop the just-failed value.
500+
// decrement len before the drop_in_place(), so a panic on Drop
501+
// doesn't re-drop the just-failed value.
502502
self.len -= 1;
503-
ptr::read(self.get_unchecked(self.len));
503+
let len = self.len;
504+
ptr::drop_in_place(self.get_unchecked_mut(len));
504505
}
505506
}
506507
}
@@ -1471,13 +1472,8 @@ impl<T> Drop for Vec<T> {
14711472
fn drop(&mut self) {
14721473
if self.buf.unsafe_no_drop_flag_needs_drop() {
14731474
unsafe {
1474-
// The branch on needs_drop() is an -O1 performance optimization.
1475-
// Without the branch, dropping Vec<u8> takes linear time.
1476-
if needs_drop::<T>() {
1477-
for x in self.iter_mut() {
1478-
ptr::drop_in_place(x);
1479-
}
1480-
}
1475+
// use drop for [T]
1476+
ptr::drop_in_place(&mut self[..]);
14811477
}
14821478
}
14831479
// RawVec handles deallocation

src/libcollections/vec_deque.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,12 @@ impl<T: Clone> Clone for VecDeque<T> {
7070
impl<T> Drop for VecDeque<T> {
7171
#[unsafe_destructor_blind_to_params]
7272
fn drop(&mut self) {
73-
self.clear();
73+
let (front, back) = self.as_mut_slices();
74+
unsafe {
75+
// use drop for [T]
76+
ptr::drop_in_place(front);
77+
ptr::drop_in_place(back);
78+
}
7479
// RawVec handles deallocation
7580
}
7681
}

0 commit comments

Comments
 (0)