comp.lang.ada
 help / color / mirror / Atom feed
From: "Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de>
Subject: Re: Renaming versus initialisation
Date: Wed, 28 Sep 2005 18:37:53 +0200
Date: 2005-09-28T18:37:45+02:00	[thread overview]
Message-ID: <1pcj2c5hcop7$.1m6hudk4iekuz$.dlg@40tude.net> (raw)
In-Reply-To: rpy_e.29956$NY4.16965@reader1.news.jippii.net

On Wed, 28 Sep 2005 15:12:23 GMT, Tapio Kelloniemi wrote:

> "Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de> wrote:
>>On 27 Sep 2005 20:00:56 -0400, Robert A Duff wrote:
>>
>>> Tapio Kelloniemi <invalid@localhost.localdomain.com> writes:
>>>
>>>> V1 : T := F;
>>>> V2 : T renames F;
>>>>
>>>> I'd like to see an explanation of the effect of an object renaming
>>>> declaration versus variable declaration and initialisation, when the object
>>>> being renamed is a return value of a function. Many thanks for it.
>>>
>>> They are pretty similar.
>>
>>What about difference in respect to creation of new objects?
> 
> Renaming creates a new object as does initialisation,

No, it creates a view.

> when not
> returning by reference (return value is copied = new object is created).

Try this with GNAT:

with Ada.Finalization;
package Foo is
   type T is new Ada.Finalization.Controlled with null record;
   procedure Finalize (X : in out T);
   function Create return T;
end Foo;
------------------------------------
with Ada.Text_IO;
package body Foo is
   procedure Finalize (X : in out T) is
   begin
      Ada.Text_IO.Put_Line ("Finalize");
   end Finalize;
   function Create return T is
   begin
      return (Ada.Finalization.Controlled with null record);
   end Create;
end Foo;
---------------------------------
with Foo;  use Foo;
with Ada.Text_IO;
procedure Baz is
begin
   Ada.Text_IO.Put_Line ("Initialization:");
   declare
      X : T := Create;
   begin
      null;
   end;
   Ada.Text_IO.Put_Line ("Renaming:");
   declare
      X : T renames Create;
   begin
      null;
   end;
end Baz;

The output should look like:

Initialization:
Finalize             -- X value created before ":="
Finalize             -- A local object in Foo
Finalize             -- X value assigned by ":="
Renaming:
Finalize             -- A local object in Foo
Finalize             -- X value renamed

A compiler has right to optimize out the local object. I believe, it also
can optimize out initialization/finalization pair of the target in
declaration with initialization, so in the end it could be same, though it
isn't in GNAT.

-- 
Regards,
Dmitry A. Kazakov
http://www.dmitry-kazakov.de



  reply	other threads:[~2005-09-28 16:37 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-09-27 21:10 Renaming versus initialisation Tapio Kelloniemi
2005-09-28  0:00 ` Robert A Duff
2005-09-28  8:02   ` Dmitry A. Kazakov
2005-09-28 15:12     ` Tapio Kelloniemi
2005-09-28 16:37       ` Dmitry A. Kazakov [this message]
2005-09-28 18:53         ` 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