Skip to content

Commit

Permalink
Auto merge of #91352 - nnethercote:RawVec-reserve_for_push, r=dtolnay
Browse files Browse the repository at this point in the history
Introduce `RawVec::reserve_for_push`.

If `Vec::push`'s capacity check fails it calls `RawVec::reserve`, which
then also does a capacity check.

This commit introduces `reserve_for_push` which skips the redundant
capacity check, for some slight compile time speed-ups.

I tried lots of minor variations on this, e.g. different inlining
attributes. This was the best one I could find.

r? `@ghost`
  • Loading branch information
bors committed Nov 30, 2021
2 parents 1c02878 + 6a83352 commit 207c80f
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 1 deletion.
8 changes: 8 additions & 0 deletions library/alloc/src/raw_vec.rs
Expand Up @@ -289,6 +289,14 @@ impl<T, A: Allocator> RawVec<T, A> {
}
}

/// A specialized version of `reserve()` used only by the hot and
/// oft-instantiated `Vec::push()`, which does its own capacity check.
#[cfg(not(no_global_oom_handling))]
#[inline(never)]
pub fn reserve_for_push(&mut self, len: usize) {
handle_reserve(self.grow_amortized(len, 1));
}

/// The same as `reserve`, but returns on errors instead of panicking or aborting.
pub fn try_reserve(&mut self, len: usize, additional: usize) -> Result<(), TryReserveError> {
if self.needs_to_grow(len, additional) {
Expand Down
2 changes: 1 addition & 1 deletion library/alloc/src/vec/mod.rs
Expand Up @@ -1726,7 +1726,7 @@ impl<T, A: Allocator> Vec<T, A> {
// This will panic or abort if we would allocate > isize::MAX bytes
// or if the length increment would overflow for zero-sized types.
if self.len == self.buf.capacity() {
self.reserve(1);
self.buf.reserve_for_push(self.len);
}
unsafe {
let end = self.as_mut_ptr().add(self.len);
Expand Down

0 comments on commit 207c80f

Please sign in to comment.