C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

wegoptimimierung bei konstruktion

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Daniel Schüle
Guest





PostPosted: Mon Sep 29, 2003 9:02 pm    Post subject: wegoptimimierung bei konstruktion Reply with quote



Hallo zusammen

Fragen sind unten im Kommentar

**************************************************
#include <iostream>

using std::cout;
using std::endl;

class a
{
public:
a(){ cout << " a " << endl; }
a(const a &){ cout << " a & " << endl; }
~a(){ cout << " ~a " << endl; }
};
class c
{
public:
c(int value_) : value(value_){ cout << " c " << endl; }
~c(){ cout << " ~c " << endl; }
private:
int value;
};

class x
{
public:
//construction von variablen erfolgt vor dem Constructor Aufruf
x() : aa(a()), cc(c(1)) { cout << " x " << endl; }
//Destructor Aufruf erfolgt vor den destruction von Variablen
~x(){ cout << " ~x " << endl; }
private:
a aa;
c cc;
};

int main()
{
x xx;
return 0;
}

/*
ich habe 2 Fragen
1)
das Programm liefert 2 verschiedene Ausgaben (siehe unten)
welche ist korrekt oder sind beide ok?
in welchem Kontext befindet sich
x() : aa(a()),
^^^^^^
ist das als
a aa(a());
aufzufassen?
darf g++ in diesem Fall a(), mit dem aa Objekt copy-construiert wird,
wegoptimieren?

g++
a
c
x
~x
~c
~a

icc
a
a &
~a
c
~c
x
~x
~c
~a


2)
ich war fruher der Meinung, dass Objekte die keinen Std-Konstruktor haben,
aber
einen Konstruktor mit einem/mehreren Parameter, nicht in anderen Klasse mit
c cc;
erzeugt werden konnen (da eben kein StdConstr vorhanden)
oben aber im Beispiel geht das, wenn in der Initialisirungsliste ":
cc(c(1))" steht
Das ist sehr praktisch. Ist das Standard? (icc, g++ akzeptieren es so)


*/

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Markus Schaaf
Guest





PostPosted: Mon Sep 29, 2003 9:35 pm    Post subject: Re: wegoptimimierung bei konstruktion Reply with quote



"Daniel Schüle" <YADaniel (AT) gmx (DOT) de> schrieb:

Quote:
class a
{
public:
a(){ cout << " a " << endl; }
a(const a &){ cout << " a & " << endl; }
~a(){ cout << " ~a " << endl; }
};
class c
{
public:
c(int value_) : value(value_){ cout << " c " << endl; }
~c(){ cout << " ~c " << endl; }
private:
int value;
};

class x
{
public:
//construction von variablen erfolgt vor dem Constructor Aufruf
x() : aa(a()), cc(c(1)) { cout << " x " << endl; }
//Destructor Aufruf erfolgt vor den destruction von Variablen
~x(){ cout << " ~x " << endl; }
private:
a aa;
c cc;
};

int main()
{
x xx;
return 0;
}

/*
ich habe 2 Fragen
1)
das Programm liefert 2 verschiedene Ausgaben (siehe unten)
welche ist korrekt oder sind beide ok?
in welchem Kontext befindet sich
x() : aa(a()),
^^^^^^
ist das als
a aa(a());
aufzufassen?

Ähnlich, ja.

Quote:
darf g++ in diesem Fall a(), mit dem aa Objekt copy-construiert wird,
wegoptimieren?

Nein.

Quote:
ich war fruher der Meinung, dass Objekte die keinen Std-Konstruktor haben,
aber
einen Konstruktor mit einem/mehreren Parameter, nicht in anderen Klasse mit
c cc;
erzeugt werden konnen

Das ist Quatsch. Jeder C'tor kann dafür verwendet werden, nicht nur der
Default-C'tor. (Es heißt nicht Std-C'tor.)

Quote:
oben aber im Beispiel geht das, wenn in der Initialisirungsliste ":
cc(c(1))" steht

»cc(1)« hätte gereicht.

Quote:
Das ist sehr praktisch. Ist das Standard?

Ja.

MfG

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Ralf Schneeweiß
Guest





PostPosted: Tue Sep 30, 2003 10:55 pm    Post subject: Re: wegoptimimierung bei konstruktion Reply with quote



Das Objekt wird ja nicht durch die Memberdeklaration "c cc;" erzeugt,
sondern eben erst durch den Aufruf des Konstruktors in der
Initialisierungsliste.

Ralf

www.oop-trainer.de

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Rolf Magnus
Guest





PostPosted: Wed Oct 01, 2003 9:01 am    Post subject: Re: wegoptimimierung bei konstruktion Reply with quote

Markus Schaaf wrote:

Quote:
ich habe 2 Fragen
1)
das Programm liefert 2 verschiedene Ausgaben (siehe unten)
welche ist korrekt oder sind beide ok?
in welchem Kontext befindet sich
x() : aa(a()),
^^^^^^
ist das als
a aa(a());
aufzufassen?

Ähnlich, ja.

darf g++ in diesem Fall a(), mit dem aa Objekt copy-construiert
wird, wegoptimieren?

Nein.

Warum nicht?

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Markus Schaaf
Guest





PostPosted: Wed Oct 01, 2003 10:51 am    Post subject: Re: wegoptimimierung bei konstruktion Reply with quote

"Rolf Magnus" <ramagnus (AT) t-online (DOT) de> schrieb:

Quote:
Warum sollte er? Compiler dürfen den äußeren Effekt eines Codes nicht
verändern. Es gibt dokumentierte Außnahmen, für die ein Copy-C'tor
Aufruf gespart werden darf, z.B. für den Fall der
"copy-initialization" von Parametern und Rückgabewerten. Beim Obigen
handelt es sich aber um "direct-initialization".

Warum? a() erzeugt ein Default-konstruiertes Temporary, aus welchem dann
per "copy initialization"

Nein. Lies!

Quote:
Oder habe ich da was falsch verstanden?

Ja.

Quote:
Es darf zumindest dann nicht wegopitmiert werden, wenn a() irgendwelche
"side effects" hat. Solange das sichtbare Verhalten des Programms sich
nicht ändert, darf der Compiler damit machen, was er will.

Warum erzählst Du mir das?

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Rolf Magnus
Guest





PostPosted: Wed Oct 01, 2003 12:37 pm    Post subject: Re: wegoptimimierung bei konstruktion Reply with quote

Markus Schaaf wrote:

Quote:
"Rolf Magnus" <ramagnus (AT) t-online (DOT) de> schrieb:

Warum sollte er? Compiler dürfen den äußeren Effekt eines Codes
nicht verändern. Es gibt dokumentierte Außnahmen, für die ein
Copy-C'tor Aufruf gespart werden darf, z.B. für den Fall der
"copy-initialization" von Parametern und Rückgabewerten. Beim
Obigen handelt es sich aber um "direct-initialization".

Warum? a() erzeugt ein Default-konstruiertes Temporary, aus welchem
dann per "copy initialization"

Nein. Lies!

Ok, aa ist weder ein Parameter, noch ein Rückgabewert, aber dennoch wird
das Objekt doch per Copy-Konstruktor initialisiert, oder nicht? Ist es
trotzdem keine "copy initialization"? Woran erkennt man dann, ob das
Kopierkonstruieren eines Objekts eine "copy initialization" oder eine
"direct initialitazion" ist?

Quote:
Oder habe ich da was falsch verstanden?

Ja.

Es darf zumindest dann nicht wegopitmiert werden, wenn a()
irgendwelche "side effects" hat. Solange das sichtbare Verhalten des
Programms sich nicht ändert, darf der Compiler damit machen, was er
will.

Warum erzählst Du mir das?

Weil es bedeutet, daß du streng genommen auch nicht ganz korrekt
argumentiert hast.

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Joerg Barfurth
Guest





PostPosted: Wed Oct 01, 2003 8:44 pm    Post subject: Re: wegoptimimierung bei konstruktion Reply with quote

Rolf Magnus <ramagnus (AT) t-online (DOT) de> wrote:

Quote:
Markus Schaaf wrote:

"Rolf Magnus" <ramagnus (AT) t-online (DOT) de> schrieb:

darf g++ in diesem Fall a(), mit dem aa Objekt copy-construiert
wird, wegoptimieren?

Nein.

Doch !

Quote:
Warum nicht?

Warum sollte er? Compiler dürfen den äußeren Effekt eines Codes nicht
verändern. Es gibt dokumentierte Außnahmen, für die ein Copy-C'tor
Aufruf gespart werden darf, z.B. für den Fall der
"copy-initialization" von Parametern und Rückgabewerten. Beim Obigen
handelt es sich aber um "direct-initialization".

Die Ausnahmeregelung hat unmittelbar nichts mit direct-initialization
oder copy-initialization zu tun. Die Regel ist vielmehr, dass jegliche
Kopien temporärer Objekte die per Copykonstruktor erfolgen und kein
Slicing beeinhalten wegoptimiert werden dürfen - selbst wenn der
Copykonstruktor Seiteneffekte hat (s. 12.8/15).

Copy-initialization wird deshalb immer wieder in diesem Kontext erwähnt,
weil dabei regelmässig solche temporären Objekte benötigt werden, die
jedesmal wegoptimiert werden können. Dennoch verweist auch der
entsprechende Standardtext nur auf 12.2 und 12.8 als normative
Grundlage.

Das bedeutet jedoch nicht, dass diese Optimierung nicht auch bei
direct-initialization per Copykonstruktor zur Anwendung kommen könnte.
Vorausgesetzt wird lediglich, dass das kopierte Objekt temporär ist und
den gleichen Typ hat wie die Kopie.

Quote:
Warum? a() erzeugt ein Default-konstruiertes Temporary, aus welchem dann
per "copy initialization" aa gemacht wird, und dieses Temporary müßte
doch wegoptimiert werden dürfen. Oder habe ich da was falsch
verstanden?

Ja: Es ist nicht copy-initialization, sondern direct-initialization per
Copykonstruktor. Dieses Missverständnis ist allerdings für die aktuelle
Frage unerheblich.

Quote:
Das ist genauso, als
wenn ich schreibe:

struct a { a(); };
int main() { a(); }

Das darf auch nicht "wegoptimiert" werden.

Das hat aber keinen Bezug zum diskutierten Thema. Hier gibt es zwar ein
temporäres Objekt - das wird aber nicht kopiert. Nur Kopien dürfen
wegoptimiert werden.

Quote:
Es darf zumindest dann nicht wegopitmiert werden, wenn a() irgendwelche
"side effects" hat. Solange das sichtbare Verhalten des Programms sich
nicht ändert, darf der Compiler damit machen, was er will.

Das stimmt. Insofern ist Markus' Aussage hier ungenau. Allerdings hat
auch das keinen Bezug zur ursprünglichen Diskussion, in der es darum
ging ob Copykonstruktoraufrufe wegoptimiert werden dürfen, die
Seiteneffekte haben (Ausgabe nach cout).

Gruss, Jörg

--
Jörg Barfurth [email]barfurth (AT) gmx (DOT) net[/email]
<<<<<<<<<<<<< using std::disclaimer; <<<<<<<<<<<<<<<<<<<<<<<<<<<<
Software Developer http://util.openoffice.org
StarOffice Configuration # Deutsch:http://de.openoffice.org

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Markus Schaaf
Guest





PostPosted: Wed Oct 01, 2003 9:01 pm    Post subject: Re: wegoptimimierung bei konstruktion Reply with quote

"Joerg Barfurth" <barfurth (AT) gmx (DOT) net> schrieb:

Quote:
Das bedeutet jedoch nicht, dass diese Optimierung nicht auch bei
direct-initialization per Copykonstruktor zur Anwendung kommen könnte.
Vorausgesetzt wird lediglich, dass das kopierte Objekt temporär ist und
den gleichen Typ hat wie die Kopie.

Ich wußte nicht, daß die Regel so weitreichend ist, obwohl ich
nochmal nachgelesen hatte, bevor ich hier schrieb. Wohl nicht
genug ...

MfG

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
André Pönitz
Guest





PostPosted: Thu Oct 02, 2003 8:10 am    Post subject: Re: wegoptimimierung bei konstruktion Reply with quote

Joerg Barfurth <barfurth (AT) gmx (DOT) net> wrote:
Quote:
Rolf Magnus <ramagnus (AT) t-online (DOT) de> wrote:

Markus Schaaf wrote:

"Rolf Magnus" <ramagnus (AT) t-online (DOT) de> schrieb:

darf g++ in diesem Fall a(), mit dem aa Objekt copy-construiert
wird, wegoptimieren?

Nein.

Doch !
[Erklaerung snipped]

Ah gut. Das rueckt mein Weltbild wieder gerade...

Andre'

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.