DIP 1014:Hooking D's struct move semantics--Community Review Round 1
kinke
noone at nowhere.com
Thu May 17 15:23:50 UTC 2018
On Thursday, 17 May 2018 at 12:36:29 UTC, Shachar Shemesh wrote:
> Again, as far as I know, structs are not copied when passed as
> arguments. They are allocated on the caller's stack and a
> reference is passed to the callee. If that's the case, no move
> (of any kind) is done.
That's the exception to the rule (LDC's `ExplicitByvalRewrite`),
and true for structs > 64 bit on Win64 (and some more structs)
and something similar for AArch64. No other ABIs supported by LDC
pass a low-level pointer to a caller-allocated copy for
high-level pass-argument-by-value semantics; the argument is
normally moved to the function parameter (in the callEE
parameters stack).
```
struct S
{
size_t a, b;
this(this) {} // no POD anymore
}
void foo(S param);
void bar()
{
// allocate a temporary on the caller's stack and move it to
the callee
foo(S(1, 2));
S lvalue;
// copy lvalue to a temporary on the caller's stack (incl.
postblit call)
// and then move that temporary to the callee
foo(lvalue);
import std.algorithm.mutation : move;
// move move()-rvalue-result to the callee
foo(move(lvalue));
}
```
'Move to callee' for most ABIs meaning a bitcopy/blit to the
callee's memory parameters stack, for LDC via LLVM `byval`
attribute.
See IR for https://run.dlang.io/is/1JIsk7.
More information about the Digitalmars-d
mailing list