[libcxx-commits] [libcxx] a798a10 - [libc++] Optimize vector<bool>(const vector<bool>&) (#161672)
via libcxx-commits
libcxx-commits at lists.llvm.org
Tue Oct 7 06:07:17 PDT 2025
Author: Nikolas Klauser
Date: 2025-10-07T15:07:12+02:00
New Revision: a798a104344deb8d30d6569564079fe06203d31d
URL: https://github.com/llvm/llvm-project/commit/a798a104344deb8d30d6569564079fe06203d31d
DIFF: https://github.com/llvm/llvm-project/commit/a798a104344deb8d30d6569564079fe06203d31d.diff
LOG: [libc++] Optimize vector<bool>(const vector<bool>&) (#161672)
```
Benchmark Baseline Candidate Difference % Difference
------------------------ ---------- ----------- ------------ --------------
BM_vector_bool_copy_ctor 56.93 10.93 -46.00 -80.80
BM_vector_bool_size_ctor 7.99 8.01 0.02 0.22
```
Added:
Modified:
libcxx/include/__vector/vector_bool.h
libcxx/test/benchmarks/containers/sequence/vector_bool.bench.cpp
Removed:
################################################################################
diff --git a/libcxx/include/__vector/vector_bool.h b/libcxx/include/__vector/vector_bool.h
index 66f5fd9498eec..759542718f66f 100644
--- a/libcxx/include/__vector/vector_bool.h
+++ b/libcxx/include/__vector/vector_bool.h
@@ -11,6 +11,7 @@
#include <__algorithm/copy.h>
#include <__algorithm/copy_backward.h>
+#include <__algorithm/copy_n.h>
#include <__algorithm/fill_n.h>
#include <__algorithm/iterator_operations.h>
#include <__algorithm/max.h>
@@ -701,7 +702,8 @@ _LIBCPP_CONSTEXPR_SINCE_CXX20 vector<bool, _Allocator>::vector(const vector& __v
__alloc_(__storage_traits::select_on_container_copy_construction(__v.__alloc_)) {
if (__v.size() > 0) {
__vallocate(__v.size());
- __construct_at_end(__v.begin(), __v.end(), __v.size());
+ std::copy_n(__v.__begin_, __external_cap_to_internal(__v.size()), __begin_);
+ __size_ = __v.size();
}
}
@@ -710,7 +712,8 @@ _LIBCPP_CONSTEXPR_SINCE_CXX20 vector<bool, _Allocator>::vector(const vector& __v
: __begin_(nullptr), __size_(0), __cap_(0), __alloc_(__a) {
if (__v.size() > 0) {
__vallocate(__v.size());
- __construct_at_end(__v.begin(), __v.end(), __v.size());
+ std::copy_n(__v.__begin_, __external_cap_to_internal(__v.size()), __begin_);
+ __size_ = __v.size();
}
}
@@ -723,7 +726,7 @@ _LIBCPP_CONSTEXPR_SINCE_CXX20 vector<bool, _Allocator>& vector<bool, _Allocator>
__vdeallocate();
__vallocate(__v.__size_);
}
- std::copy(__v.__begin_, __v.__begin_ + __external_cap_to_internal(__v.__size_), __begin_);
+ std::copy_n(__v.__begin_, __external_cap_to_internal(__v.size()), __begin_);
}
__size_ = __v.__size_;
}
diff --git a/libcxx/test/benchmarks/containers/sequence/vector_bool.bench.cpp b/libcxx/test/benchmarks/containers/sequence/vector_bool.bench.cpp
index 6ecb268208cc8..cdfc1041c6b65 100644
--- a/libcxx/test/benchmarks/containers/sequence/vector_bool.bench.cpp
+++ b/libcxx/test/benchmarks/containers/sequence/vector_bool.bench.cpp
@@ -9,6 +9,17 @@
#include <benchmark/benchmark.h>
#include <vector>
+static void BM_vector_bool_copy_ctor(benchmark::State& state) {
+ std::vector<bool> vec(100, true);
+
+ for (auto _ : state) {
+ benchmark::DoNotOptimize(vec);
+ std::vector<bool> vec2(vec);
+ benchmark::DoNotOptimize(vec2);
+ }
+}
+BENCHMARK(BM_vector_bool_copy_ctor);
+
static void BM_vector_bool_size_ctor(benchmark::State& state) {
for (auto _ : state) {
std::vector<bool> vec(100, true);
More information about the libcxx-commits
mailing list