tbu: too many has to be checked on every element, too few only has to be checked at the end. e.g.
// can be more than size_hint
let size = iter.size_hint().0
let mut vec = Vec::with_capacity(size);
let mut ptr = vec.ptr_mut();
for (i, elem) in iter.enumerate() {
if i > size {
resize_or_something()
} else {
ptr.write(elem);
ptr = ptr.offset(1);
}
vec.set_len(i);
}
vec
vs
// can be less than size_hint
let size = iter.size_hint().0
let mut vec = Vec::with_capacity(size);
let mut ptr = vec.ptr_mut();
let mut guard = PanicGuard::new(&mut vec, &ptr as *const _);
for elem in iter {
ptr.write(elem);
ptr = ptr.offset(1);
}
drop(guard);
vec
impl Drop for PanicGuard {
let len = (*self.ptr as usize) - (self.vec.ptr() as usize);
self.vec.set_len(len);
}
Seems pretty obvious which is going to have better perf?