[PATCH 3/2] libstdc++: Optimize std::projected<I, std::identity>
Patrick Palka
ppalka@redhat.com
Wed Aug 21 12:57:37 GMT 2024
Tested on x86_64-pc-linux-gnu, does this look OK for trunk? I'm not
sure if the current specification of 'projected' strictly speaking
allows for this optimization, but it seems like a natural one that
should be allowed.
-- >8 --
Algorithms that are generalized to take projections usually default the
projection to std::identity, which really means no projection at all.
In that case, I believe we could shortcut the projection logic to return
the indirectly readable type unchanged rather than a wrapped version of
it. This should help with compile times especially after P2609R3 which
made the indirect invocability concepts more expensive to check when
projections are in the picture.
libstdc++-v3/ChangeLog:
* include/bits/iterator_concepts.h (__detail::__projected):
Define partial specialization for a std::identity projection.
---
libstdc++-v3/include/bits/iterator_concepts.h | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/libstdc++-v3/include/bits/iterator_concepts.h b/libstdc++-v3/include/bits/iterator_concepts.h
index d849ddc32fc..642c709fee0 100644
--- a/libstdc++-v3/include/bits/iterator_concepts.h
+++ b/libstdc++-v3/include/bits/iterator_concepts.h
@@ -803,6 +803,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
using __projected_Proj = _Proj;
};
};
+
+ // Optimize the common case of the projection being std::identity.
+ template<typename _Iter>
+ struct __projected<_Iter, identity>
+ { using __type = _Iter; };
} // namespace __detail
/// [projected], projected
--
2.46.0.267.gbb9c16bd4f
More information about the Libstdc++
mailing list