Skip to content

Commit 91582ca

Browse files
committed
review comments on vec-zsts
1 parent 8ba098c commit 91582ca

File tree

1 file changed

+15
-6
lines changed

1 file changed

+15
-6
lines changed

src/vec-zsts.md

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,22 +49,26 @@ impl<T> RawVec<T> {
4949
}
5050
5151
fn grow(&mut self) {
52+
let elem_size = mem::size_of::<T>();
53+
let align = mem::align_of::<T>();
5254
unsafe {
5355
// Since we set the capacity to `usize::MAX` for ZST is
5456
// 0, getting to here necessarily means the Vec is overfull.
55-
assert!(mem::size_of::<T>() != 0, "capacity overflow");
57+
assert!(elem_size == 0, "capacity overflow");
5658
57-
let layout = alloc::Layout::new::<T>();
59+
let layout;
5860
5961
let (new_cap, ptr) = if self.cap == 0 {
62+
layout = alloc::Layout::from_size_align_unchecked(elem_size, align);
6063
let ptr = alloc::alloc(layout);
6164
(1, ptr)
6265
} else {
6366
let new_cap = self.cap * 2;
67+
layout = alloc::Layout::from_size_align_unchecked(self.cap * elem_size, align);
6468
let ptr = alloc::realloc(
6569
self.ptr.as_ptr() as *mut u8,
6670
layout,
67-
new_cap * mem::size_of::<T>(),
71+
new_cap * elem_size,
6872
);
6973
(new_cap, ptr)
7074
};
@@ -82,10 +86,15 @@ impl<T> RawVec<T> {
8286
8387
impl<T> Drop for RawVec<T> {
8488
fn drop(&mut self) {
85-
// Do not free zero-sized allocations, as they were never allocated.
86-
if self.cap != 0 && mem::size_of::<T>() != 0 {
89+
let align = mem::align_of::<T>();
90+
let elem_size = mem::size_of::<T>();
91+
// don't free zero-sized allocations, as they were never allocated.
92+
if self.cap != 0 && elem_size != 0 {
8793
unsafe {
88-
alloc::dealloc(self.ptr.as_ptr() as *mut u8, alloc::Layout::new::<T>());
94+
alloc::dealloc(
95+
self.ptr.as_ptr() as *mut u8,
96+
alloc::Layout::from_size_align_unchecked(self.cap * elem_size, align),
97+
);
8998
}
9099
}
91100
}

0 commit comments

Comments
 (0)