ソースを参照

fix(vector): fix bugs, optimize memory allocation

reserve m_size + n on reallocation
do not allocate memory if m_capacity will be 0 after allocation
greatbridf 1 年間 前
コミット
5cf3c5bd56
1 ファイル変更8 行追加4 行削除
  1. 8 4
      gblibstdc++/include/vector

+ 8 - 4
gblibstdc++/include/vector

@@ -93,9 +93,13 @@ private:
     // assert(n >= m_size)
     constexpr void _reallocate_safe(size_type n)
     {
-        auto* newptr = alloc_traits::allocate(m_alloc, n);
+        T* newptr = nullptr;
+        if (n)
+            newptr = alloc_traits::allocate(m_alloc, n);
+
         for (size_t i = 0; i < m_size; ++i) {
-            alloc_traits::construct(m_alloc, newptr + i, std::move(m_data[i]));
+            if (n)
+                alloc_traits::construct(m_alloc, newptr + i, std::move(m_data[i]));
             alloc_traits::destroy(m_alloc, m_data + i);
         }
 
@@ -364,7 +368,7 @@ public:
             reserve(n);
 
         if (m_size + n > m_capacity)
-            reserve(m_capacity * 2);
+            reserve(m_size + n);
         for (size_type i = m_size + n - 1; i >= idx + n; --i)
             alloc_traits::construct(m_alloc, m_data + i, std::move(m_data[i-n]));
         for (size_type i = idx; i < idx + n; ++i)
@@ -392,7 +396,7 @@ public:
             reserve(n);
 
         if (m_size + n > m_capacity)
-            reserve(m_capacity * 2);
+            reserve(m_size + n);
         for (size_type i = m_size + n - 1; i >= idx + n; --i)
             alloc_traits::construct(m_alloc, m_data + i, std::move(m_data[i-n]));
         for (size_type i = idx; i < idx + n; ++i)