https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114149
Bug ID: 114149 Summary: lexicographical_compare should use memcmp for C++20 contiguous iterators as well as pointers Product: gcc Version: 14.0 Status: UNCONFIRMED Keywords: missed-optimization Severity: normal Priority: P3 Component: libstdc++ Assignee: unassigned at gcc dot gnu.org Reporter: redi at gcc dot gnu.org Target Milestone: --- __lexicographical_compare_aux1 has: const bool __simple = (__is_memcmp_ordered_with<_ValueType1, _ValueType2>::__value && __is_pointer<_II1>::__value && __is_pointer<_II2>::__value #if __cplusplus > 201703L && __glibcxx_concepts // For C++20 iterator_traits<volatile T*>::value_type is non-volatile // so __is_byte<T> could be true, but we can't use memcmp with // volatile data. && !is_volatile_v<remove_reference_t<iter_reference_t<_II1>>> && !is_volatile_v<remove_reference_t<iter_reference_t<_II2>>> #endif We should use memcmp for contiguous iterators, not only pointers. There's a similar condition in ranges::lexicographical_compare.