Remove algo code duplication
François Dumont
frs.dumont@gmail.com
Fri May 4 19:25:00 GMT 2012
I though that I wouldn't have to take care of this kind of use case but
you are right I better handle it correctly.
So I am going to write tests challenging the number of constructors
invoked when algos are used with or without my patch, in C++98 and C++11
modes.
To be continued...
On 05/02/2012 10:10 PM, Marc Glisse wrote:
> [Jonathan already answered most of it]
>
> On Wed, 2 May 2012, François Dumont wrote:
>
>>>> 2. Compatible with existing code, code submitted by Christopher
>>>> last time will still compile. To do so I used
>>>> std::iterator_traits<>::reference type so that if the iterator is
>>>> not const then the operator do not have to take const reference or
>>>> to be const qualified neither. For the same reason I have also
>>>> avoided some const qualifiers on the introduced functors.
>>>
>>> It probably doesn't matter, but the difference with the current code
>>> can be seen. With -fno-elide-constructors you perform copies,
>>> operator< is always given an lvalue, etc.
>> You mean functor copies, right ? I expect the compiler to optimize
>> them away even if there are options to forbid him to do so.
>
> I mean value copies, performed by the functor.
>
> #include <iostream>
> struct A {
> A(){std::cout << "A()\n";}
> A(A const&){std::cout << "A(A const&)\n";}
> A(A &&){std::cout << "A(A &&)\n";}
> };
> bool operator<(A,A){return true;}
> struct less {
> bool operator()(A a,A b)const{return a<b;}
> };
> struct Iter {
> A operator*()const{return A();}
> };
>
> int main(){
> Iter x;
> std::cout << "hello\n";
> *x < *x; // all copies elided
> std::cout << "pause\n";
> less()(*x,*x); // 2 copies can't be elided
> std::cout << "bye\n";
> }
>
> hello
> A()
> A()
> pause
> A()
> A()
> A(A const&)
> A(A const&)
> bye
>
>
> I am not saying it is necessarily a bad thing, just that the
> difference is noticable. Note that the functor less posted by Jonathan
> would keep 2 move constructors instead of the 2 copy constructors.
>
> (note: I am not sure that's what I had in mind when I wrote that
> email, I can't remember exactly)
>
More information about the Libstdc++
mailing list