On Wednesday, 21 March 2018 at 12:15:13 UTC, Simen Kjærås wrote:
I'm pretty sure you're seeing NRVO - Named Return Value
Optimization. Also called copy elision:
https://en.wikipedia.org/wiki/Copy_elision
The compiler sees that when you return r, it's immediately
assigned to b. Since it's a waste of cycles to allocate twice
and copy the values, the function is told where the result will
end up, and writes it there immediately.
The reason you don't see that with c is that the compiler isn't
very smart, especially not with optimizations turned off, so it
doesn't know for sure that it can safely overwrite the values
already in c at that point.
Thanks a lot, that explains things.
I was really surprised, as I had compiler optimizations
in mind before I posted. I ran the tests without any optimization
using ldc2 -g -O0, but the outcome was the same.
Thanks for your help,
qnerd