summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorHampusM <hampus@hampusmat.com>2025-03-28 14:32:52 +0100
committerHampusM <hampus@hampusmat.com>2025-03-28 14:32:52 +0100
commit11ba9c8430069a7b8f3b86cc0071740e582a12c2 (patch)
tree12cf3987dc48eee83e49aa5aeb00aaff4d00e53d /src
parent23b5d962f68aef3b8a860b971f0832e44a7a5602 (diff)
perf: use alloc instead of realloc
Diffstat (limited to 'src')
-rw-r--r--src/lib.rs55
1 files changed, 33 insertions, 22 deletions
diff --git a/src/lib.rs b/src/lib.rs
index 31e8810..175eef9 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -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();
}
}
}