From f8e0ff7f33338c2874b75e45e4ea5abbfafb954c Mon Sep 17 00:00:00 2001 From: Evan Brown Date: Mon, 3 Oct 2022 10:51:40 -0700 Subject: Use trivial relocation for transfers in swisstable and b-tree. PiperOrigin-RevId: 478547898 Change-Id: Ie20cd0a49df042be912888ee238333a5f5fa0404 --- absl/container/internal/container_memory.h | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) (limited to 'absl/container/internal/container_memory.h') diff --git a/absl/container/internal/container_memory.h b/absl/container/internal/container_memory.h index 00e9f6d7..c29c533b 100644 --- a/absl/container/internal/container_memory.h +++ b/absl/container/internal/container_memory.h @@ -17,6 +17,7 @@ #include #include +#include #include #include #include @@ -340,7 +341,8 @@ template struct map_slot_policy { using slot_type = map_slot_type; using value_type = std::pair; - using mutable_value_type = std::pair; + using mutable_value_type = + std::pair, absl::remove_const_t>; private: static void emplace(slot_type* slot) { @@ -424,6 +426,15 @@ struct map_slot_policy { static void transfer(Allocator* alloc, slot_type* new_slot, slot_type* old_slot) { emplace(new_slot); +#if defined(__cpp_lib_launder) && __cpp_lib_launder >= 201606 + if (absl::is_trivially_relocatable()) { + // TODO(b/247130232): remove cast after fixing class-memaccess warning. + std::memcpy(static_cast(std::launder(&new_slot->value)), + &old_slot->value, sizeof(value_type)); + return; + } +#endif + if (kMutableKeys::value) { absl::allocator_traits::construct( *alloc, &new_slot->mutable_value, std::move(old_slot->mutable_value)); -- cgit v1.2.3