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

Atila Neves atila.neves at gmail.com
Tue Mar 27 07:14:46 UTC 2018


On Monday, 26 March 2018 at 19:24:13 UTC, Manu wrote:
> On 26 March 2018 at 07:40, Atila Neves via Digitalmars-d 
> <digitalmars-d at puremagic.com> wrote:
>> On Friday, 23 March 2018 at 22:01:44 UTC, Manu wrote:
>>>
>>> Forked from the x^^y thread...
>>> <snip>
>>
>>
>> C++ T&& (forwarding reference) -> D auto ref T
>> C++ T&& (Rvalue reference) -> D T
>> C++ const T& -> D T
>
> Yeah, no... T may be big. Copying a large thing sucks. Memory 
> copying
> is the slowest thing computers can do.

That's _if_ T is big and _if_ it even gets copied, the 
combination of which I think happens very rarely. When that 
happens I think that the temporary isn't a big deal. This code:

struct Foo { int[1024] data; }
int byValue(Foo f) { return f.data[42]; }

Generates this assembly (ldc2 -O3, clang does the same for C++):

0000000000000000 <_D3foo7byValueFSQo3FooZi>:
    0:   8b 84 24 b0 00 00 00    mov    eax,DWORD PTR [rsp+0xb0]
    7:   c3                      ret

And I wrote a type for which a move and a copy are the same on 
purpose: in "real life" it's more likely that the memory will be 
dynamically allocated, probably held in a slice, and moved 
instead.

Are there cases in which there will be an expensive copy? Yes, 
then pass by ref/pointer. But measure first, and prefer to pass 
by value by default.

It's different in C++ - stick a std::vector or std::string in 
your struct and passing by value (usually) copies the dynamically 
allocated memory. In D it moves.

> As an API author, exactly as in C++, you will make a judgement 
> on a
> case-by-case basis on this matter. It may be by-value, it may 
> be by
> const-ref. It depends on a bunch of things, and they are points 
> for
> consideration by the API author, not the user.

You can still do that in D. There well may be a reason to pass by 
const ref. I'm just saying that there aren't that many, and in 
that in those rare cases a temporary is fine. Especially if the 
alternative are rvalue references.

Atila


More information about the Digitalmars-d mailing list