rvalues -> ref (yup... again!)

Rubn where at is.this
Sun Mar 25 05:01:52 UTC 2018


On Sunday, 25 March 2018 at 01:43:43 UTC, Jonathan M Davis wrote:
> On Sunday, March 25, 2018 00:34:38 Rubn via Digitalmars-d wrote:
>> On Saturday, 24 March 2018 at 23:03:36 UTC, John Colvin wrote:
>> > Auto ref allows the unnecessary copy to be avoided for 
>> > lvalues and creates a temporary (as part of passing the 
>> > value) for rvalues. It has downsides (virtual functions and 
>> > extern(C++), but it does directly address the problem you're 
>> > talking about, unless I have totally misunderstood you.
>>
>> You are trading syntax bloat for binary bloat. Having 4 
>> parameters with auto ref can generate 16 different variants 
>> for the exact same function. If you are doing any sort of 
>> mathematical calculations you could cause a potential cache 
>> miss for calling the same exact function because one of your 
>> parameters didn't end up being the same type of value. You are 
>> causing all this bloat and potential slowdowns all to avoid 
>> having to do this:
>>
>> float value0 = a + b;
>> float value1 = c + d;
>> float value2 = e + f;
>> someFunc(value0, value1, value2);
>>
>> That's an inherent flaw in design. You obviously agree that 
>> there is a problem, but how can you justify "auto ref" being a 
>> "good" solution to the problem? It's a horrible one, it causes 
>> excessive bloat and potential slowdowns just to get a cleaner 
>> readable syntax. That shouldn't be a solution that is deemed 
>> acceptable.
>
> How good or bad it is depends on what you're doing and how many 
> auto ref parameters there are in your code. If you're using it 
> occasionally, it's not a problem at all, whereas if you're 
> using it all over the place, you do get a lot of template bloat.
>
> Regardless, John's point was that auto ref solves the problem 
> of being able to call a function with both lvalues and rvalues 
> without copying lvalues, and he didn't understand why anyone 
> was trying to argue that it doesn't do that. And I agree with 
> him on that point. It does not help with virtual functions or 
> extern(C++), and it creates a lot of template bloat if it's 
> used heavily, so there are downsides to it, but it _does_ solve 
> the basic problem of being able to call a function with both 
> lvalues and rvalues without copying the lvalues. It just 
> doesn't solve it in a way that everyone considers acceptable.

That's a horrible way to look at it. You can still technically 
drive a car with square wheels, it may not be a very comfortable 
or efficient ride, but it still __does__ solve the basic problem 
of moving the car. Because it works we shouldn't look at any 
other solution.

> auto ref also helps with forwarding refness, so it's useful for 
> more than just avoiding copying lvalues, but the entire reason 
> that auto ref was originally added to the language was to solve 
> this exact problem. And maybe we need a different solution for 
> some use cases (like virtual functions or cases where the 
> template bloat is deemed unacceptable), but auto ref is in the 
> language to solve this problem. So, much as at may make sense 
> to argue that it's not a good solution to this problem, it 
> really doesn't make sense to argue that it has nothing to do 
> with it.

I never said it has nothing to do with it. It's just a really 
horrible solution.

If you are going to add an exception just for two minor cases, at 
that point you might as well start looking at adding rvalue 
references, cause that's what it is going to lead to. It'd 
provided better integration with C++ and provide an 
__acceptable__ solution to the problem (not one that solves the 
problem in a roundabout square-wheel-like way) that doesn't 
create runtime bloat and slowdown just to have clean readable 
syntax.




More information about the Digitalmars-d mailing list