From 27134f25b11e3119a2814988c3979fdc033e54e1 Mon Sep 17 00:00:00 2001 From: Abseil Team Date: Fri, 12 Jan 2024 12:31:42 -0800 Subject: Speed up `raw_hash_map::[]` with ABSL hardening enabled by unchecking dereference of iterator returned by `try_emplace`. PiperOrigin-RevId: 597920257 Change-Id: I1b2e8f10a2f1efa763a6f0760294beafdb6fd9c0 --- absl/container/internal/raw_hash_map.h | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) (limited to 'absl/container/internal/raw_hash_map.h') diff --git a/absl/container/internal/raw_hash_map.h b/absl/container/internal/raw_hash_map.h index c1d4d4bc..97182bc7 100644 --- a/absl/container/internal/raw_hash_map.h +++ b/absl/container/internal/raw_hash_map.h @@ -177,13 +177,20 @@ class raw_hash_map : public raw_hash_set { template MappedReference

operator[](key_arg&& key) ABSL_ATTRIBUTE_LIFETIME_BOUND { - return Policy::value(&*try_emplace(std::forward(key)).first); + // It is safe to use unchecked_deref here because try_emplace + // will always return an iterator pointing to a valid item in the table, + // since it inserts if nothing is found for the given key. + return Policy::value( + &this->unchecked_deref(try_emplace(std::forward(key)).first)); } template MappedReference

operator[](const key_arg& key) ABSL_ATTRIBUTE_LIFETIME_BOUND { - return Policy::value(&*try_emplace(key).first); + // It is safe to use unchecked_deref here because try_emplace + // will always return an iterator pointing to a valid item in the table, + // since it inserts if nothing is found for the given key. + return Policy::value(&this->unchecked_deref(try_emplace(key).first)); } private: -- cgit v1.2.3