On Tue, 27 May 2025 at 13:26, Tomasz Kaminski <tkami...@redhat.com> wrote:
>
>
>
> On Fri, May 23, 2025 at 7:00 PM Jonathan Wakely <jwak...@redhat.com> wrote:
>>
>> Since r16-154-gc91eb5a5c13f14 std::addressof is no less efficient than
>> std::__addressof, so change some uses of the latter to the former.
>>
>> We can't change them all, because some uses need to compile as C++98
>> which only has std::__addressof.
>>
>> libstdc++-v3/ChangeLog:
>>
>>         * include/bits/stl_construct.h: Replace std::__addressof with
>>         std::addressof.
>>         * include/bits/stl_uninitialized.h: Likewise.
>> ---
>>
>> I'm undecided whether it's better to use the standard std::addressof for
>> simplicity, or to stick with std::__addressof in files where there's a
>> mix of C++98 code and >= C++11 code.
>
> After giving this a bit of thought. If I touch this files, then most likely we
> are implementing the new standard features, and in the patch I will just
> default to std::addressof, as in any other case. So preferring to use
> std::addressof when available seems like easier to maintain policy.
>
>>
>>
>> Obviously in files that don't need to compile as C++98 (such as
>> <optional>) we could just use std::addressof.
>>
>> Tested x86_64-linux.
>>
>>
>>  libstdc++-v3/include/bits/stl_construct.h     |  2 +-
>>  libstdc++-v3/include/bits/stl_uninitialized.h | 28 +++++++++----------
>>  2 files changed, 15 insertions(+), 15 deletions(-)
>>
>> diff --git a/libstdc++-v3/include/bits/stl_construct.h 
>> b/libstdc++-v3/include/bits/stl_construct.h
>> index 23b8fb754710..a53274e33c0c 100644
>> --- a/libstdc++-v3/include/bits/stl_construct.h
>> +++ b/libstdc++-v3/include/bits/stl_construct.h
>> @@ -82,7 +82,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>>        if constexpr (__cplusplus > 201703L && is_array_v<_Tp>)
>>         {
>>           for (auto& __x : *__location)
>> -           std::destroy_at(std::__addressof(__x));
>> +           std::destroy_at(std::addressof(__x));
>>         }
>>        else
>>         __location->~_Tp();
>
> There are calls to __addressof in _Destroy at lines 212, 216, 268, 272 in 
> calls that are >= C++11.
> If we update them, we should also change all of them in file.

I have another patch locally which replaced those ones (and in my tree
that patch is actually first).

I'll finish the other changes to stl_construct.h that I'm working on,
and then after that I'll replace all >= C++11 uses of __addressof.


>
>>
>> diff --git a/libstdc++-v3/include/bits/stl_uninitialized.h 
>> b/libstdc++-v3/include/bits/stl_uninitialized.h
>> index b1428db48b00..bde787c2beaa 100644
>> --- a/libstdc++-v3/include/bits/stl_uninitialized.h
>> +++ b/libstdc++-v3/include/bits/stl_uninitialized.h
>
> Looks like all of ones that could be updated in this file, are already.
>>
>> @@ -839,7 +839,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>>          {
>>           _UninitDestroyGuard<_ForwardIterator> __guard(__first);
>>           for (; __first != __last; ++__first)
>> -           std::_Construct(std::__addressof(*__first));
>> +           std::_Construct(std::addressof(*__first));
>>           __guard.release();
>>         }
>>      };
>> @@ -856,7 +856,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>>             return;
>>
>>           typename iterator_traits<_ForwardIterator>::value_type* __val
>> -           = std::__addressof(*__first);
>> +           = std::addressof(*__first);
>>           std::_Construct(__val);
>>           if (++__first != __last)
>>             std::fill(__first, __last, *__val);
>> @@ -873,7 +873,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>>          {
>>           _UninitDestroyGuard<_ForwardIterator> __guard(__first);
>>           for (; __n > 0; --__n, (void) ++__first)
>> -           std::_Construct(std::__addressof(*__first));
>> +           std::_Construct(std::addressof(*__first));
>>           __guard.release();
>>           return __first;
>>         }
>> @@ -890,7 +890,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>>           if (__n > 0)
>>             {
>>               typename iterator_traits<_ForwardIterator>::value_type* __val
>> -               = std::__addressof(*__first);
>> +               = std::addressof(*__first);
>>               std::_Construct(__val);
>>               ++__first;
>>               __first = std::fill_n(__first, __n - 1, *__val);
>> @@ -955,7 +955,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>>                                                                 __alloc);
>>        typedef __gnu_cxx::__alloc_traits<_Allocator> __traits;
>>        for (; __first != __last; ++__first)
>> -       __traits::construct(__alloc, std::__addressof(*__first));
>> +       __traits::construct(__alloc, std::addressof(*__first));
>>        __guard.release();
>>      }
>>
>> @@ -980,7 +980,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>>                                                                 __alloc);
>>        typedef __gnu_cxx::__alloc_traits<_Allocator> __traits;
>>        for (; __n > 0; --__n, (void) ++__first)
>> -       __traits::construct(__alloc, std::__addressof(*__first));
>> +       __traits::construct(__alloc, std::addressof(*__first));
>>        __guard.release();
>>        return __first;
>>      }
>> @@ -1007,7 +1007,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>>         {
>>           _UninitDestroyGuard<_ForwardIterator> __guard(__first);
>>           for (; __first != __last; ++__first)
>> -           std::_Construct_novalue(std::__addressof(*__first));
>> +           std::_Construct_novalue(std::addressof(*__first));
>>           __guard.release();
>>         }
>>      };
>> @@ -1033,7 +1033,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>>         {
>>           _UninitDestroyGuard<_ForwardIterator> __guard(__first);
>>           for (; __n > 0; --__n, (void) ++__first)
>> -           std::_Construct_novalue(std::__addressof(*__first));
>> +           std::_Construct_novalue(std::addressof(*__first));
>>           __guard.release();
>>           return __first;
>>         }
>> @@ -1089,7 +1089,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>>      {
>>        _UninitDestroyGuard<_ForwardIterator> __guard(__result);
>>        for (; __n > 0; --__n, (void) ++__first, ++__result)
>> -       std::_Construct(std::__addressof(*__result), *__first);
>> +       std::_Construct(std::addressof(*__result), *__first);
>>        __guard.release();
>>        return __result;
>>      }
>> @@ -1112,7 +1112,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>>      {
>>        _UninitDestroyGuard<_ForwardIterator> __guard(__result);
>>        for (; __n > 0; --__n, (void) ++__first, ++__result)
>> -       std::_Construct(std::__addressof(*__result), *__first);
>> +       std::_Construct(std::addressof(*__result), *__first);
>>        __guard.release();
>>        return {__first, __result};
>>      }
>> @@ -1276,11 +1276,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>>      noexcept(noexcept(std::allocator_traits<_Allocator>::construct(__alloc,
>>                          __dest, std::move(*__orig)))
>>              && noexcept(std::allocator_traits<_Allocator>::destroy(
>> -                           __alloc, std::__addressof(*__orig))))
>> +                           __alloc, std::addressof(*__orig))))
>>      {
>>        typedef std::allocator_traits<_Allocator> __traits;
>>        __traits::construct(__alloc, __dest, std::move(*__orig));
>> -      __traits::destroy(__alloc, std::__addressof(*__orig));
>> +      __traits::destroy(__alloc, std::addressof(*__orig));
>>      }
>>
>>    // This class may be specialized for specific types.
>> @@ -1308,8 +1308,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>>           "relocation is only possible for values of the same type");
>>        _ForwardIterator __cur = __result;
>>        for (; __first != __last; ++__first, (void)++__cur)
>> -       std::__relocate_object_a(std::__addressof(*__cur),
>> -                                std::__addressof(*__first), __alloc);
>> +       std::__relocate_object_a(std::addressof(*__cur),
>> +                                std::addressof(*__first), __alloc);
>>        return __cur;
>>      }
>>
>> --
>> 2.49.0
>>

Reply via email to