Proposal: takeFront and takeBack

Jonathan M Davis jmdavisProg at gmx.com
Wed Jul 4 15:10:10 PDT 2012


On Thursday, July 05, 2012 00:03:02 Timon Gehr wrote:
> On 07/04/2012 11:53 PM, deadalnix wrote:
> > Le 04/07/2012 20:40, Jonathan M Davis a écrit :
> >> On Wednesday, July 04, 2012 12:55:44 Tobias Pankrath wrote:
> >>>> Many languages does this (it doesn't mean it is the right thing
> >>>> to do). Do you know why this shouldn't be done ?
> >>> 
> >>> In C++ it was exception safety, wasn't it?
> >> 
> >> I believe that it was purely a question of speed. If popFront returns an
> >> element, then that element gets copied, and if you didn't need to
> >> access the
> >> element, then that's wasted cycles. You have to worry about exceptions in
> >> either case, depending on the what popFront is doing.
> >> 
> >> - Jonathan M Davis
> > 
> > If you return by reference, you get an overhead of 1 MOV instruction.
> > This is ridiculous.
> 
> You get an 'overhead' of calling front, which is potentially unbounded.
> 
> struct Map(...){
>      ...
>      @property auto ref front() { return f(otherRange.front); }
> }

Not to mention, in many cases, you _can't_ return a ref like deadalnix 
suggests, because that would require that front be returning an lvalue, and it 
often isn't. And in the case of strings - which is the prime reason for this 
discussion in the first place - it definitely can't return an lvalue, because 
front is calculated (that and returning a value from popFront would make 
popFront much more expensive in the case where you _don't_ actually need to 
access front, so making popFront return an element doesn't help the string 
case at all).

- Jonathan M  Davis


More information about the Digitalmars-d mailing list