https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118647
Bug ID: 118647 Summary: Missed optimization to do memcpy/memmove for contiguous iterator Product: gcc Version: unknown Status: UNCONFIRMED Severity: normal Priority: P3 Component: libstdc++ Assignee: unassigned at gcc dot gnu.org Reporter: alfredo.correa at gmail dot com Target Milestone: --- I would like to report a missed optimization opportunity for contiguous iterators in C++20 and up. I have an iterator that fulfills the contigous_iterator concept and I am trying to use the copy algorithms. Naively one would think that the generated code should produce a memmove (or a memcpy), however 1) With std::copy the optimization only happens sometimes. That is, the library is demanding that some iterator operators (op* and op==) be no-except for actually doing the optimization. That might or might not be a bug, but it certainly disagrees with libc++. 2) With std::ranges::copy the optimization never happens, which definitely is a missed opportunity. This is the illustration of the problem: https://godbolt.org/z/shsvn9oqx (note the -DNOEX parameter that controls noexcept in the iterator op, (some functions are not defined so the compile doesn't try to deduce an effective noexcept) And this the iterator examplar: ``` class cont_iter { int* impl_; public: using value_type = int; using reference = value_type&; using pointer = value_type*; using difference_type = std::ptrdiff_t; using iterator_concept = std::contiguous_iterator_tag; explicit cont_iter(); int& operator*() const noexcept(NOEX); int& operator[](difference_type) const; int* operator->() const; cont_iter& operator++(); cont_iter operator++(int); cont_iter& operator--(); cont_iter operator--(int); cont_iter& operator+=(difference_type); cont_iter& operator-=(difference_type); cont_iter operator+(difference_type) const; friend cont_iter operator+(difference_type, cont_iter); cont_iter operator-(difference_type) const; difference_type operator-(cont_iter const&) const; std::strong_ordering operator<=>(cont_iter const&) const; bool operator==(cont_iter const&) const noexcept(NOEX); }; static_assert(std::contiguous_iterator<cont_iter>); ``` For context, this is to implement a contiguous iterator in a multidimensional library, in which under certain parametrizations of the iterator can be deduced to be contiguous. Full code here: https://godbolt.org/z/fv7cvbq51 Also, Arthur O'Dwyer and Peter Ditmov helped get to be bottom of this on the #stl Slack channel.