Auto merge of #104205 - clubby789:grow-rc, r=thomcc
Attempt to reuse `Vec<T>` backing storage for `Rc/Arc<[T]>` If a `Vec<T>` has sufficient capacity to store the inner `RcBox<[T]>`, we can just reuse the existing allocation and shift the elements up, instead of making a new allocation.
This commit is contained in:
commit
36db030a7c
4 changed files with 161 additions and 38 deletions
|
@ -210,3 +210,18 @@ fn weak_may_dangle() {
|
|||
// `val` dropped here while still borrowed
|
||||
// borrow might be used here, when `val` is dropped and runs the `Drop` code for type `std::sync::Weak`
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn arc_from_vec_opt() {
|
||||
let mut v = Vec::with_capacity(64);
|
||||
v.push(0usize);
|
||||
let addr = v.as_ptr().cast::<u8>();
|
||||
let arc: Arc<[_]> = v.into();
|
||||
unsafe {
|
||||
assert_eq!(
|
||||
arc.as_ptr().cast::<u8>().offset_from(addr),
|
||||
(std::mem::size_of::<usize>() * 2) as isize,
|
||||
"Vector allocation not reused"
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -206,3 +206,18 @@ fn weak_may_dangle() {
|
|||
// `val` dropped here while still borrowed
|
||||
// borrow might be used here, when `val` is dropped and runs the `Drop` code for type `std::rc::Weak`
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn rc_from_vec_opt() {
|
||||
let mut v = Vec::with_capacity(64);
|
||||
v.push(0usize);
|
||||
let addr = v.as_ptr().cast::<u8>();
|
||||
let rc: Rc<[_]> = v.into();
|
||||
unsafe {
|
||||
assert_eq!(
|
||||
rc.as_ptr().cast::<u8>().offset_from(addr),
|
||||
(std::mem::size_of::<usize>() * 2) as isize,
|
||||
"Vector allocation not reused"
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue