comp.lang.ada
 help / color / mirror / Atom feed
From: "Randy Brukardt" <randy@rrsoftware.com>
Subject: Re: Why is the destructor called multiple times after I declare an object?
Date: Mon, 11 Jan 2016 17:44:41 -0600
Date: 2016-01-11T17:44:41-06:00	[thread overview]
Message-ID: <n71epa$b1h$1@loke.gir.dk> (raw)
In-Reply-To: n715oq$fae$1@gioia.aioe.org

"Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de> wrote in message 
news:n715oq$fae$1@gioia.aioe.org...
> On 2016-01-11 19:17, Bob Duff wrote:
>> Brian Drummond <brian@shapes.demon.co.uk> writes:
>>
>>> Somehow I expected "extended return" to allocate space and "build in
>>> place" during the execution of the return statement.
>>
>> Build-in-place is done for return of immutably-limited types,
>> whether or not the extended return syntax is used.
>
> But you can leave one return statement on an exception, catch the 
> exception, and then return through another return statement, with other 
> discriminants and even other type of the result (if it is class-wide).
>
> Therefore the result can be potentially allocated and reallocated any 
> number of times. In which sense is this behavior 'in-place'?

"Build-in-place" means simply that there is no temporary object, the object 
is created directly in its final resting place (that is the memory where it 
will live during its existence).

Whatever amount of effort it takes to figure out that final resting place is 
not part of the equation.

For many situations (and implementation models), the size of the result 
object will not change regardless of discriminants chosen, so the sort of 
thing you describe above cannot happen. For assignments to most existing 
objects, the discriminants/tag cannot be changed, and 6.5(24/3) allows the 
Constraint_Error exception to be raised early in scenarios like the one you 
lay out. (Such an exception cannot be handled within the function, as it 
happens at the call-site.) If the discriminants are mutable, the compiler 
already has to have some mechanism for changing them [either by using 
allocate-to-the-max or reallocation], and build-in-place uses that same 
mechanism, without the temporary. You'd get the same behavior when assigning 
some other object as with a build-in-place function.)

                                                 Randy.




  reply	other threads:[~2016-01-11 23:44 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-01-11  1:37 Why is the destructor called multiple times after I declare an object? Andrew Shvets
2016-01-11  2:18 ` Jeffrey R. Carter
2016-01-11  3:35   ` Andrew Shvets
2016-01-11 17:02     ` Brian Drummond
2016-01-11 16:29   ` Brian Drummond
2016-01-11 17:20     ` Simon Wright
2016-01-11 18:17     ` Bob Duff
2016-01-11 21:10       ` Dmitry A. Kazakov
2016-01-11 23:44         ` Randy Brukardt [this message]
2016-01-12  9:33           ` Dmitry A. Kazakov
2016-01-12 20:21             ` Randy Brukardt
2016-01-12 21:05               ` Dmitry A. Kazakov
2016-01-13  0:02                 ` Robert A Duff
2016-01-13  8:31                   ` Dmitry A. Kazakov
2016-01-13  9:01                     ` Georg Bauhaus
2016-01-13 14:45                     ` J-P. Rosen
2016-01-13 20:09                       ` Dmitry A. Kazakov
2016-01-14  9:04                         ` J-P. Rosen
2016-01-14  9:47                           ` Dmitry A. Kazakov
2016-01-13 16:03                     ` Robert A Duff
2016-01-13 19:59                       ` Dmitry A. Kazakov
2016-01-14 10:04                         ` Georg Bauhaus
2016-01-14 13:42                           ` Dmitry A. Kazakov
2016-01-12 12:41       ` Brian Drummond
2016-01-13 20:18       ` Jacob Sparre Andersen
2016-01-14  1:31         ` Robert A Duff
2016-01-12  0:43     ` Jeffrey R. Carter
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox