diff options
| author | Matt Brubeck <mbrubeck@limpet.net> | 2017-03-09 17:53:01 -0800 |
|---|---|---|
| committer | Matt Brubeck <mbrubeck@limpet.net> | 2017-04-15 09:01:56 -0700 |
| commit | 675475c4d3e3b1ebff5b761570f4a3f9a0ca23df (patch) | |
| tree | 49cfa5b4d6edca5205909e9b0729e9744507940c /src/liballoc/raw_vec.rs | |
| parent | 5637ed756632ded9e458b82a23cc1dddbb57c51f (diff) | |
| download | rust-675475c4d3e3b1ebff5b761570f4a3f9a0ca23df.tar.gz rust-675475c4d3e3b1ebff5b761570f4a3f9a0ca23df.zip | |
Specialize Vec::from_elem<u8> to use calloc or memset
Fixes #38723.
Diffstat (limited to 'src/liballoc/raw_vec.rs')
| -rw-r--r-- | src/liballoc/raw_vec.rs | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/src/liballoc/raw_vec.rs b/src/liballoc/raw_vec.rs index 357a2724e00..6a53d3a9ca5 100644 --- a/src/liballoc/raw_vec.rs +++ b/src/liballoc/raw_vec.rs @@ -81,7 +81,18 @@ impl<T> RawVec<T> { /// # Aborts /// /// Aborts on OOM + #[inline] pub fn with_capacity(cap: usize) -> Self { + RawVec::allocate(cap, false) + } + + /// Like `with_capacity` but guarantees the buffer is zeroed. + #[inline] + pub fn with_capacity_zeroed(cap: usize) -> Self { + RawVec::allocate(cap, true) + } + + fn allocate(cap: usize, zeroed: bool) -> Self { unsafe { let elem_size = mem::size_of::<T>(); @@ -93,7 +104,11 @@ impl<T> RawVec<T> { heap::EMPTY as *mut u8 } else { let align = mem::align_of::<T>(); - let ptr = heap::allocate(alloc_size, align); + let ptr = if zeroed { + heap::allocate_zeroed(alloc_size, align) + } else { + heap::allocate(alloc_size, align) + }; if ptr.is_null() { oom() } |
