about summary refs log tree commit diff
path: root/library/alloc/src/vec
diff options
context:
space:
mode:
authorAngelicosPhosphoros <xuzin.timur@gmail.com>2021-12-20 23:58:45 +0300
committerMark Rousskov <mark.simulacrum@gmail.com>2022-01-19 09:47:49 -0500
commitea570c689cf5dfb07f39853cc26701f382dff9a6 (patch)
treefb0164fc0ae5f491754860891961d77d4b3122e7 /library/alloc/src/vec
parent2f004d2d401682e553af3984ebd9a3976885e752 (diff)
downloadrust-ea570c689cf5dfb07f39853cc26701f382dff9a6.tar.gz
rust-ea570c689cf5dfb07f39853cc26701f382dff9a6.zip
Improve estimation of capacity in Vec::from_iter
Closes #48994
Diffstat (limited to 'library/alloc/src/vec')
-rw-r--r--library/alloc/src/vec/spec_from_iter_nested.rs10
1 files changed, 8 insertions, 2 deletions
diff --git a/library/alloc/src/vec/spec_from_iter_nested.rs b/library/alloc/src/vec/spec_from_iter_nested.rs
index 948cf044197..f915ebb86e5 100644
--- a/library/alloc/src/vec/spec_from_iter_nested.rs
+++ b/library/alloc/src/vec/spec_from_iter_nested.rs
@@ -1,5 +1,8 @@
+use core::cmp;
 use core::iter::TrustedLen;
-use core::ptr::{self};
+use core::ptr;
+
+use crate::raw_vec::RawVec;
 
 use super::{SpecExtend, Vec};
 
@@ -24,8 +27,11 @@ where
             None => return Vec::new(),
             Some(element) => {
                 let (lower, _) = iterator.size_hint();
-                let mut vector = Vec::with_capacity(lower.saturating_add(1));
+                let initial_capacity =
+                    cmp::max(RawVec::<T>::MIN_NON_ZERO_CAP, lower.saturating_add(1));
+                let mut vector = Vec::with_capacity(initial_capacity);
                 unsafe {
+                    // SAFETY: We requested capacity at least 1
                     ptr::write(vector.as_mut_ptr(), element);
                     vector.set_len(1);
                 }