diff options
| author | bors <bors@rust-lang.org> | 2022-11-17 10:48:22 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2022-11-17 10:48:22 +0000 |
| commit | 36db030a7c3c51cb4484cbd8c8daebcf5057d61c (patch) | |
| tree | 0d083a09dd9b64e2cad9ef236f6345199dbdb74a /library/alloc/tests | |
| parent | 7c75fe4c8547c276574cacb144919d67fd8ab302 (diff) | |
| parent | 8424c24837fffdb83796c5da52094b296445f08f (diff) | |
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.
Diffstat (limited to 'library/alloc/tests')
| -rw-r--r-- | library/alloc/tests/arc.rs | 15 | ||||
| -rw-r--r-- | library/alloc/tests/rc.rs | 15 |
2 files changed, 30 insertions, 0 deletions
diff --git a/library/alloc/tests/arc.rs b/library/alloc/tests/arc.rs index ce40b5c9b0a..eb379e4d6a1 100644 --- a/library/alloc/tests/arc.rs +++ b/library/alloc/tests/arc.rs @@ -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" + ); + } +} diff --git a/library/alloc/tests/rc.rs b/library/alloc/tests/rc.rs index efb39a60966..1d5f3c52006 100644 --- a/library/alloc/tests/rc.rs +++ b/library/alloc/tests/rc.rs @@ -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" + ); + } +} |
