Auto merge of #89337 - mbrubeck:vec-leak, r=m-ou-se
Avoid allocations and copying in Vec::leak The [`Vec::leak`] method (#62195) is currently implemented by calling `Vec::into_boxed_slice` and `Box::leak`. This shrinks the vector before leaking it, which potentially causes a reallocation and copies the vector's contents. By avoiding the conversion to `Box`, we can instead leak the vector without any expensive operations, just by returning a slice reference and forgetting the `Vec`. Users who *want* to shrink the vector first can still do so by calling `shrink_to_fit` explicitly. **Note:** This could break code that uses `Box::from_raw` to “un-leak” the slice returned by `Vec::leak`. However, the `Vec::leak` docs explicitly forbid this, so such code is already incorrect. [`Vec::leak`]: https://doc.rust-lang.org/stable/std/vec/struct.Vec.html#method.leak
This commit is contained in:
commit
265fef45f2
1 changed files with 5 additions and 3 deletions
|
@ -1973,8 +1973,9 @@ impl<T, A: Allocator> Vec<T, A> {
|
||||||
/// `'a`. If the type has only static references, or none at all, then this
|
/// `'a`. If the type has only static references, or none at all, then this
|
||||||
/// may be chosen to be `'static`.
|
/// may be chosen to be `'static`.
|
||||||
///
|
///
|
||||||
/// This function is similar to the [`leak`][Box::leak] function on [`Box`]
|
/// As of Rust 1.57, this method does not reallocate or shrink the `Vec`,
|
||||||
/// except that there is no way to recover the leaked memory.
|
/// so the leaked allocation may include unused capacity that is not part
|
||||||
|
/// of the returned slice.
|
||||||
///
|
///
|
||||||
/// This function is mainly useful for data that lives for the remainder of
|
/// This function is mainly useful for data that lives for the remainder of
|
||||||
/// the program's life. Dropping the returned reference will cause a memory
|
/// the program's life. Dropping the returned reference will cause a memory
|
||||||
|
@ -1997,7 +1998,8 @@ impl<T, A: Allocator> Vec<T, A> {
|
||||||
where
|
where
|
||||||
A: 'a,
|
A: 'a,
|
||||||
{
|
{
|
||||||
Box::leak(self.into_boxed_slice())
|
let mut me = ManuallyDrop::new(self);
|
||||||
|
unsafe { slice::from_raw_parts_mut(me.as_mut_ptr(), me.len) }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the remaining spare capacity of the vector as a slice of
|
/// Returns the remaining spare capacity of the vector as a slice of
|
||||||
|
|
Loading…
Add table
Reference in a new issue