rval->ref const(T), implicit conversions
tsbockman via Digitalmars-d
digitalmars-d at puremagic.com
Tue Jan 19 09:48:24 PST 2016
On Tuesday, 19 January 2016 at 17:23:33 UTC, bitwise wrote:
> On Tuesday, 19 January 2016 at 06:17:17 UTC, tsbockman wrote:
>> On Tuesday, 19 January 2016 at 05:43:57 UTC, bitwise wrote:
>>> [..]
>>
>> There are several problems with this:
>>
>> 1) It introduces substantial template bloat, as the number of
>> instantiations of the entire function - including the body! -
>> scales as the square of the number of `auto ref` parameters.
>
> Your solution suffers from exactly the same problem. It still
> uses auto ref.
You seem to have missed the significance of the "including the
body!" part. Directly using `auto ref` results in all the code in
THE BODY of the function being recompiled once *per
instantiation*.
Mine just recompiles THE WRAPPER, which is tiny and force
inlined, and therefore should not bloat the generated binary at
all.
It will still slow down compilation a bit, but nowhere near as
much as recompiling an arbitrarily large function body 2^N times.
>> 2) rvalues will be passed by value, which could be slow if the
>> type is bulkier than `int`.
>
> No, they won't. Temporaries will be created for rvalues, and
> lvalues will be passed by ref.
Whether a name is attached to it or not, a temporary will be
created on the stack in the calling function.
My wrapper passes a pointer to that stack location to the actual
function implementation, rather than copying it into the stack
frame of the function being called. This allows the same
generated code to be used for the function, regardless of whether
an rvalue or lvalue is passed.
>> 3) `auto ref` CANNOT be used on an extern(C++) function,
>> because the rvalue calls won't link!
>
> This is the _one_ advantage that your solution actually has
> over simply templatizing the function.
You are obviously confused about either about how template
instantiation works in D, or about the mechanics of pass-by-ref
versus pass-by-value. I'm not sure which.
> You are still missing the point though. This shouldn't even be
> a problem in the first place. It's faulty language design. This
> limitation makes no sense, and should be removed. There is no
> argument anyone can make that isn't totally broken.
I have no idea why you keep trying to argue with me about the
language design. I already agreed it would be better to just
directly support passing rvalues to `ref` (or preferably,
`scope`) parameters in the compiler.
But again, I have ZERO control over this. I am not the one you
need to convince - Walter and Andrei are.
The fact that *I know* that I'm not in charge of the language
design does not mean I am "missing the point".
More information about the Digitalmars-d
mailing list