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::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::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& vector __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 #include +static void BM_vector_bool_copy_ctor(benchmark::State& state) { + std::vector vec(100, true); + + for (auto _ : state) { + benchmark::DoNotOptimize(vec); + std::vector 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 vec(100, true);