Skip to content

Commit f23417b

Browse files
nnethercoteGankra
authored andcommitted
Optimize clone.
Currently it reserves capacity using `with_capacity`. It then calls `extend`, which (unnecessarily) calls `reserve`. It then calls `push` N times, each of which (unnecessarily) does a capacity check.
1 parent 98449c2 commit f23417b

File tree

1 file changed

+12
-2
lines changed

1 file changed

+12
-2
lines changed

src/lib.rs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1267,8 +1267,18 @@ where
12671267
T: Clone,
12681268
{
12691269
fn clone(&self) -> ThinVec<T> {
1270-
let mut new_vec = ThinVec::with_capacity(self.len());
1271-
new_vec.extend(self.iter().cloned());
1270+
let len = self.len();
1271+
let mut new_vec = ThinVec::<T>::with_capacity(len);
1272+
let mut data_raw = new_vec.data_raw();
1273+
for x in self.iter() {
1274+
unsafe {
1275+
ptr::write(data_raw, x.clone());
1276+
data_raw = data_raw.add(1);
1277+
}
1278+
}
1279+
unsafe {
1280+
new_vec.set_len(len); // could be the singleton
1281+
}
12721282
new_vec
12731283
}
12741284
}

0 commit comments

Comments
 (0)