[libcxx-commits] [libcxx] [libc++] Optimize vector<bool>::reserve (PR #170137)

Nikolas Klauser via libcxx-commits libcxx-commits at lists.llvm.org
Mon Dec 1 05:57:26 PST 2025


https://github.com/philnik777 updated https://github.com/llvm/llvm-project/pull/170137

>From 5d5eec26a1842b9c49e92e398c038bc38a5554e0 Mon Sep 17 00:00:00 2001
From: Nikolas Klauser <nikolasklauser at berlin.de>
Date: Mon, 1 Dec 2025 14:34:13 +0100
Subject: [PATCH] [libc++] Optimize vector<bool>::reserve

---
 libcxx/docs/ReleaseNotes/22.rst                     |  1 +
 libcxx/include/__vector/vector_bool.h               |  3 ++-
 .../containers/sequence/vector_bool.bench.cpp       | 13 +++++++++++--
 3 files changed, 14 insertions(+), 3 deletions(-)

diff --git a/libcxx/docs/ReleaseNotes/22.rst b/libcxx/docs/ReleaseNotes/22.rst
index 6ea323ced3003..f66967c6ec935 100644
--- a/libcxx/docs/ReleaseNotes/22.rst
+++ b/libcxx/docs/ReleaseNotes/22.rst
@@ -82,6 +82,7 @@ Improvements and New Features
 - The ``std::{generate, generate_n}`` and ``std::ranges::generate_n`` algorithms have been optimized for segmented
   iterators, resulting in a performance improvement for ``std::deque<short>`` and
   ``std::join_view<vector<vector<short>>>`` iterators.
+- The performance of ``vector<bool>::reserve()`` has been improved by up to 2x.
 
 - The ``num_get::do_get`` integral overloads have been optimized, resulting in a performance improvement of up to 2.8x.
 
diff --git a/libcxx/include/__vector/vector_bool.h b/libcxx/include/__vector/vector_bool.h
index 6cb8f2a7fb012..5e2b3d4e92d47 100644
--- a/libcxx/include/__vector/vector_bool.h
+++ b/libcxx/include/__vector/vector_bool.h
@@ -856,7 +856,8 @@ _LIBCPP_CONSTEXPR_SINCE_CXX20 void vector<bool, _Allocator>::reserve(size_type _
       this->__throw_length_error();
     vector __v(this->get_allocator());
     __v.__vallocate(__n);
-    __v.__construct_at_end(this->begin(), this->end(), this->size());
+    __v.__size_ = __size_;
+    std::copy_n(__begin_, __external_cap_to_internal(__size_), __v.__begin_);
     swap(__v);
   }
 }
diff --git a/libcxx/test/benchmarks/containers/sequence/vector_bool.bench.cpp b/libcxx/test/benchmarks/containers/sequence/vector_bool.bench.cpp
index cdfc1041c6b65..1fb17fa9e2533 100644
--- a/libcxx/test/benchmarks/containers/sequence/vector_bool.bench.cpp
+++ b/libcxx/test/benchmarks/containers/sequence/vector_bool.bench.cpp
@@ -18,7 +18,7 @@ static void BM_vector_bool_copy_ctor(benchmark::State& state) {
     benchmark::DoNotOptimize(vec2);
   }
 }
-BENCHMARK(BM_vector_bool_copy_ctor);
+BENCHMARK(BM_vector_bool_copy_ctor)->Name("vector<bool>(const vector<bool>&)");
 
 static void BM_vector_bool_size_ctor(benchmark::State& state) {
   for (auto _ : state) {
@@ -26,6 +26,15 @@ static void BM_vector_bool_size_ctor(benchmark::State& state) {
     benchmark::DoNotOptimize(vec);
   }
 }
-BENCHMARK(BM_vector_bool_size_ctor);
+BENCHMARK(BM_vector_bool_size_ctor)->Name("vector<bool>(size_type, const value_type&)");
+
+static void BM_vector_bool_reserve(benchmark::State& state) {
+  for (auto _ : state) {
+    std::vector<bool> vec;
+    vec.reserve(100);
+    benchmark::DoNotOptimize(vec);
+  }
+}
+BENCHMARK(BM_vector_bool_reserve)->Name("vector<bool>::reserve()");
 
 BENCHMARK_MAIN();



More information about the libcxx-commits mailing list