[PATCH 3/2] libstdc++: Optimize std::projected<I, std::identity>
Jonathan Wakely
jwakely@redhat.com
Wed Aug 21 13:15:10 GMT 2024
On Wed, 21 Aug 2024 at 13:58, Patrick Palka wrote:
>
> 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.
Yeah, I can't see any conformance problems with doing this. I'm sure
somebody smarter than me will point it out if there's a problem, so
let's try it and see.
OK for trunk, thanks.
>
> -- >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