DIP 1014
Shachar Shemesh
shachar at weka.io
Thu Oct 4 03:06:35 UTC 2018
On 03/10/18 23:25, Stanislav Blinov wrote:
> It *is* true when the type doesn't have a destructor. Extending that to
> a move hook, it will also be true because destruction will be elided.
> I know what you're talking about, that happens for types that have
> destructors.
No, destructors have nothing to do with it, as well they shouldn't. The
whole point of D moving structs around is that no destruction is needed.
It took me a while to figure out why your program does appear to work.
At first I thought it was because of inlining, but that was wrong.
The reason your test case works (sometimes, if you don't breath on it
too heavily) is because the object is actually moved twice. Once when
returning from the function into the variable, and another when copied
into opAssign's argument. This results in it returning to its original
address.
If you do *anything* to that program, and that includes even changing
its compilation flags (try enabling inlining), it will stop working.
You should have known that when you found out it doesn't work on ldc:
ldc and dmd use the same front-end. If you think something works
fundamentally different between the two, you are probably wrong.
To verify my guess is right, I tried the following change: add to
createCounter and createCounterNoNRV in your original program (no
destructors) the following two lines:
int a;
write(a);
You have added another local variable to the functions, but otherwise
changed absolutely nothing. You will notice your program now has an offset.
Shachar
More information about the Digitalmars-d
mailing list