diff options
author | HampusM <hampus@hampusmat.com> | 2025-03-28 14:32:52 +0100 |
---|---|---|
committer | HampusM <hampus@hampusmat.com> | 2025-03-28 14:32:52 +0100 |
commit | 11ba9c8430069a7b8f3b86cc0071740e582a12c2 (patch) | |
tree | 12cf3987dc48eee83e49aa5aeb00aaff4d00e53d /src | |
parent | 23b5d962f68aef3b8a860b971f0832e44a7a5602 (diff) |
perf: use alloc instead of realloc
Diffstat (limited to 'src')
-rw-r--r-- | src/lib.rs | 55 |
1 files changed, 33 insertions, 22 deletions
@@ -1,5 +1,5 @@ #![deny(clippy::all, clippy::pedantic)] -use std::alloc::{alloc, dealloc, handle_alloc_error, realloc, Layout}; +use std::alloc::{alloc, dealloc, handle_alloc_error, Layout}; use std::any::{Any, TypeId}; use std::cmp::max; use std::mem::MaybeUninit; @@ -320,30 +320,32 @@ impl MultiVec let Some(new_ptr) = NonNull::new(if layout.size() == 0 { std::ptr::dangling_mut() } else { - unsafe { realloc(self.ptr.as_ptr().cast::<u8>(), *layout, new_layout.size()) } + unsafe { alloc(new_layout) } }) else { handle_alloc_error(new_layout); }; - for (field_index, field) in fields.as_ref().iter().enumerate().rev() { - let old_field_arr_byte_offset = self.field_arr_byte_offsets[field_index]; - let new_field_arr_byte_offset = new_field_arr_byte_offsets[field_index]; + for field_index in 0..self.field_cnt() { + let field_slice = self.get_field_slice(field_index); - let old_field_arr_ptr = - unsafe { new_ptr.byte_add(old_field_arr_byte_offset) }; - - let new_field_arr_ptr = - unsafe { new_ptr.byte_add(new_field_arr_byte_offset) }; + let new_byte_offset = new_field_arr_byte_offsets[field_index]; unsafe { - std::ptr::copy( - old_field_arr_ptr.as_ptr(), - new_field_arr_ptr.as_ptr(), - field.size() * self.capacity, + std::ptr::copy_nonoverlapping( + field_slice.bytes.as_ptr(), + new_ptr + .byte_add(new_byte_offset) + .cast::<MaybeUninit<u8>>() + .as_ptr(), + field_slice.bytes.len(), ); } } + unsafe { + self.dealloc(); + } + self.ptr = new_ptr.cast::<MaybeUninit<u8>>(); self.layout = Some(new_layout); self.capacity = new_capacity; @@ -419,6 +421,21 @@ impl MultiVec } } } + + unsafe fn dealloc(&mut self) + { + let Some(layout) = self.layout else { + return; + }; + + if layout.size() == 0 { + return; + } + + unsafe { + std::alloc::dealloc(self.ptr.as_ptr().cast::<u8>(), layout); + } + } } //impl<ItemT> FromIterator<ItemT> for MultiVec<ItemT> @@ -474,14 +491,8 @@ impl Drop for MultiVec } } - if let Some(layout) = self.layout { - if layout.size() == 0 { - return; - } - - unsafe { - std::alloc::dealloc(self.ptr.as_ptr().cast::<u8>(), layout); - } + unsafe { + self.dealloc(); } } } |