[libcxx-commits] [libcxx] [libc++] Optimize vector::__move_range for trivially copyable types (PR #207384)
Nikolas Klauser via libcxx-commits
libcxx-commits at lists.llvm.org
Fri Jul 10 00:51:38 PDT 2026
https://github.com/philnik777 updated https://github.com/llvm/llvm-project/pull/207384
>From 9c6f7a1b75377c5497f54b202cff588e6bc98bde Mon Sep 17 00:00:00 2001
From: Nikolas Klauser <nikolasklauser at berlin.de>
Date: Fri, 3 Jul 2026 13:34:50 +0200
Subject: [PATCH] [libc++] Optimize vector::__move_range for trivially copyable
types
This is a code size rather than a performance optimization.
For example, the number of instructions in `__insert_with_iter` is
almost cut in half.
---
libcxx/include/__vector/vector.h | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/libcxx/include/__vector/vector.h b/libcxx/include/__vector/vector.h
index 422c98c300a1d..a226e5dc621c4 100644
--- a/libcxx/include/__vector/vector.h
+++ b/libcxx/include/__vector/vector.h
@@ -47,6 +47,7 @@
#include <__ranges/container_compatible_range.h>
#include <__ranges/from_range.h>
#include <__split_buffer>
+#include <__string/constexpr_c_functions.h>
#include <__type_traits/conditional.h>
#include <__type_traits/enable_if.h>
#include <__type_traits/is_allocator.h>
@@ -57,6 +58,7 @@
#include <__type_traits/is_pointer.h>
#include <__type_traits/is_same.h>
#include <__type_traits/is_swappable.h>
+#include <__type_traits/is_trivially_copyable.h>
#include <__type_traits/is_trivially_relocatable.h>
#include <__type_traits/type_identity.h>
#include <__utility/declval.h>
@@ -1120,6 +1122,18 @@ _LIBCPP_CONSTEXPR_SINCE_CXX20 void
vector<_Tp, _Allocator>::__move_range(pointer __from_s, pointer __from_e, pointer __to) {
pointer __old_last = __layout_.__end_ptr();
difference_type __n = __old_last - __to;
+#ifndef _LIBCPP_CXX03_LANG
+ if constexpr (__allocator_has_trivial_move_construct_v<allocator_type, value_type> &&
+ is_trivially_copyable<value_type>::value) {
+ if (!__libcpp_is_constant_evaluated()) {
+ auto __count = __from_e - __from_s;
+ __annotate_increase(__count - __n);
+ std::__constexpr_memmove(std::__to_address(__to), std::__to_address(__from_s), __element_count(__count));
+ __layout_.__set_bound_using_pointer(__to + __count);
+ return;
+ }
+ }
+#endif
{
pointer __i = __from_s + __n;
_ConstructTransaction __tx(*this, __from_e - __i);
More information about the libcxx-commits
mailing list