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
next prev parent 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