returning struct, destructor

kinke via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Wed Dec 21 09:49:22 PST 2016


On Wednesday, 21 December 2016 at 15:01:20 UTC, Eugene Wissner 
wrote:
> On Wednesday, 21 December 2016 at 14:15:06 UTC, John C wrote:
>> On Wednesday, 21 December 2016 at 11:45:18 UTC, Eugene Wissner 
>> wrote:
>>> This prints 3 times "Destruct" with dmd 0.072.1. If I remove 
>>> the if block, it prints "Destruct" only 2 times - the 
>>> behavior I'm expecting. Why?
>>
>> Possibly to do with named return value optimisation.
>
> Isn't an optimization that changes the behavior bad? I had a 
> crash in the code where the destructor did something 
> meaningfull, freed the memory (the same pointer) twice.

Basic stuff such as this is appropriately tested. The named 
return value optimization is enforced by D (incl. unoptimized 
builds), so behavior doesn't change by this optimization. It's 
you who changed the behavior by removing the if. Due to the `if`, 
the compiler doesn't know whether it should construct `a` or `b` 
directly into the memory (sret pointee) provided by the caller. 
When omitting the `if`, it's clear that `b` is returned in all 
cases, so the compiles constructs `a` on the local stack (and 
destructs it before exiting the function), but emplaces `b` into 
`*sret` (i.e., the caller's stack) and can thus elide 1x postblit 
+ 1x dtor.


More information about the Digitalmars-d-learn mailing list