[PATCH] libstdc++: Use 'if constexpr' to simplify std::vector relocation
Tomasz Kaminski
tkaminsk@redhat.com
Tue Apr 29 09:09:59 GMT 2025
On Tue, Apr 29, 2025 at 10:56 AM Jonathan Wakely <jwakely@redhat.com> wrote:
> Simplify std::vector's use of std::__relocate_a by using 'if constexpr'
> even in C++11 and C++14, with diagnostic pragmas to disable warnings.
> This allows us to call std::__relocate_a directly, instead of via
> _S_relocate and tag distpatching.
>
> Preserve _S_relocate so that explicit instantiations still get it, but
> make it a no-op when _S_use_relocate() is false, so that we don't
> instantiate __relocate_a if it isn't needed.
>
> libstdc++-v3/ChangeLog:
>
> * include/bits/stl_vector.h (_S_do_relocate): Remove.
> (_S_relocate): Remove tag dispatching path.
> * include/bits/vector.tcc (reserve, _M_realloc_insert)
> (_M_realloc_append, _M_default_append): Add diagnostic pragmas
> and use 'if constexpr' in C++11 and C++14. Call
> std::__relocate_a directly instead of _S_relocate.
> ---
>
> Tested x86_64-linux.
>
LGTM, thanks for adding an explanation note for keeping _S_relocate.
>
> libstdc++-v3/include/bits/stl_vector.h | 26 +++++-----------
> libstdc++-v3/include/bits/vector.tcc | 41 +++++++++++++++++---------
> 2 files changed, 34 insertions(+), 33 deletions(-)
>
> diff --git a/libstdc++-v3/include/bits/stl_vector.h
> b/libstdc++-v3/include/bits/stl_vector.h
> index aff9d5d9ca5..57680b7bbcf 100644
> --- a/libstdc++-v3/include/bits/stl_vector.h
> +++ b/libstdc++-v3/include/bits/stl_vector.h
> @@ -518,29 +518,17 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> return _S_nothrow_relocate(__is_move_insertable<_Tp_alloc_type>{});
> }
>
> - static pointer
> - _S_do_relocate(pointer __first, pointer __last, pointer __result,
> - _Tp_alloc_type& __alloc, true_type) noexcept
> - {
> - return std::__relocate_a(__first, __last, __result, __alloc);
> - }
> -
> - static pointer
> - _S_do_relocate(pointer, pointer, pointer __result,
> - _Tp_alloc_type&, false_type) noexcept
> - { return __result; }
> -
> static _GLIBCXX20_CONSTEXPR pointer
> _S_relocate(pointer __first, pointer __last, pointer __result,
> _Tp_alloc_type& __alloc) noexcept
> {
> -#if __cpp_if_constexpr
> - // All callers have already checked _S_use_relocate() so just do
> it.
> - return std::__relocate_a(__first, __last, __result, __alloc);
> -#else
> - using __do_it = __bool_constant<_S_use_relocate()>;
> - return _S_do_relocate(__first, __last, __result, __alloc,
> __do_it{});
> -#endif
> +#pragma GCC diagnostic push
> +#pragma GCC diagnostic ignored "-Wc++17-extensions" // if constexpr
> + if constexpr (_S_use_relocate())
> + return std::__relocate_a(__first, __last, __result, __alloc);
> + else
> + return __result;
> +#pragma GCC diagnostic pop
> }
> #endif // C++11
>
> diff --git a/libstdc++-v3/include/bits/vector.tcc
> b/libstdc++-v3/include/bits/vector.tcc
> index b21e1d3b7a2..e18f01ab0ae 100644
> --- a/libstdc++-v3/include/bits/vector.tcc
> +++ b/libstdc++-v3/include/bits/vector.tcc
> @@ -61,6 +61,9 @@ namespace std _GLIBCXX_VISIBILITY(default)
> _GLIBCXX_BEGIN_NAMESPACE_VERSION
> _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
>
> +#pragma GCC diagnostic push
> +#pragma GCC diagnostic ignored "-Wc++17-extensions" // if constexpr
> +
> template<typename _Tp, typename _Alloc>
> _GLIBCXX20_CONSTEXPR
> void
> @@ -74,11 +77,11 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> const size_type __old_size = size();
> pointer __tmp;
> #if __cplusplus >= 201103L
> - if _GLIBCXX17_CONSTEXPR (_S_use_relocate())
> + if constexpr (_S_use_relocate())
> {
> __tmp = this->_M_allocate(__n);
> - _S_relocate(this->_M_impl._M_start, this->_M_impl._M_finish,
> - __tmp, _M_get_Tp_allocator());
> + std::__relocate_a(this->_M_impl._M_start,
> this->_M_impl._M_finish,
> + __tmp, _M_get_Tp_allocator());
> }
> else
> #endif
> @@ -98,6 +101,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> this->_M_impl._M_end_of_storage = this->_M_impl._M_start + __n;
> }
> }
> +#pragma GCC diagnostic pop
>
> #if __cplusplus >= 201103L
> template<typename _Tp, typename _Alloc>
> @@ -444,6 +448,8 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> #endif
> }
>
> +#pragma GCC diagnostic push
> +#pragma GCC diagnostic ignored "-Wc++17-extensions" // if constexpr
> #if __cplusplus >= 201103L
> template<typename _Tp, typename _Alloc>
> template<typename... _Args>
> @@ -488,14 +494,16 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> #endif
>
> #if __cplusplus >= 201103L
> - if _GLIBCXX17_CONSTEXPR (_S_use_relocate())
> + if constexpr (_S_use_relocate())
> {
> // Relocation cannot throw.
> - __new_finish = _S_relocate(__old_start, __position.base(),
> - __new_start, _M_get_Tp_allocator());
> + __new_finish = std::__relocate_a(__old_start,
> __position.base(),
> + __new_start,
> + _M_get_Tp_allocator());
> ++__new_finish;
> - __new_finish = _S_relocate(__position.base(), __old_finish,
> - __new_finish,
> _M_get_Tp_allocator());
> + __new_finish = std::__relocate_a(__position.base(),
> __old_finish,
> + __new_finish,
> + _M_get_Tp_allocator());
> }
> else
> #endif
> @@ -593,11 +601,12 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> #endif
>
> #if __cplusplus >= 201103L
> - if _GLIBCXX17_CONSTEXPR (_S_use_relocate())
> + if constexpr (_S_use_relocate())
> {
> // Relocation cannot throw.
> - __new_finish = _S_relocate(__old_start, __old_finish,
> - __new_start, _M_get_Tp_allocator());
> + __new_finish = std::__relocate_a(__old_start, __old_finish,
> + __new_start,
> + _M_get_Tp_allocator());
> ++__new_finish;
> }
> else
> @@ -645,6 +654,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> this->_M_impl._M_finish = __new_finish;
> this->_M_impl._M_end_of_storage = __new_start + __len;
> }
> +#pragma GCC diagnostic pop
>
> template<typename _Tp, typename _Alloc>
> _GLIBCXX20_CONSTEXPR
> @@ -751,6 +761,8 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> }
>
> #if __cplusplus >= 201103L
> +#pragma GCC diagnostic push
> +#pragma GCC diagnostic ignored "-Wc++17-extensions" // if constexpr
> template<typename _Tp, typename _Alloc>
> _GLIBCXX20_CONSTEXPR
> void
> @@ -794,10 +806,10 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> std::__uninitialized_default_n_a(__new_start + __size, __n,
> _M_get_Tp_allocator());
>
> - if _GLIBCXX17_CONSTEXPR (_S_use_relocate())
> + if constexpr (_S_use_relocate())
> {
> - _S_relocate(__old_start, __old_finish,
> - __new_start, _M_get_Tp_allocator());
> + std::__relocate_a(__old_start, __old_finish,
> + __new_start, _M_get_Tp_allocator());
> }
> else
> {
> @@ -842,6 +854,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
> }
> }
> }
> +#pragma GCC diagnostic pop
>
> template<typename _Tp, typename _Alloc>
> _GLIBCXX20_CONSTEXPR
> --
> 2.49.0
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://gcc.gnu.org/pipermail/libstdc++/attachments/20250429/19e96cf2/attachment-0001.htm>
More information about the Libstdc++
mailing list