 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Daniel Schüle Guest
|
Posted: Mon Sep 29, 2003 9:02 pm Post subject: wegoptimimierung bei konstruktion |
|
|
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
|
Posted: Mon Sep 29, 2003 9:35 pm Post subject: Re: wegoptimimierung bei konstruktion |
|
|
"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
|
Posted: Tue Sep 30, 2003 10:55 pm Post subject: Re: wegoptimimierung bei konstruktion |
|
|
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
|
Posted: Wed Oct 01, 2003 9:01 am Post subject: Re: wegoptimimierung bei konstruktion |
|
|
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
|
Posted: Wed Oct 01, 2003 10:51 am Post subject: Re: wegoptimimierung bei konstruktion |
|
|
"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
|
Posted: Wed Oct 01, 2003 12:37 pm Post subject: Re: wegoptimimierung bei konstruktion |
|
|
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
|
Posted: Wed Oct 01, 2003 8:44 pm Post subject: Re: wegoptimimierung bei konstruktion |
|
|
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
|
Posted: Wed Oct 01, 2003 9:01 pm Post subject: Re: wegoptimimierung bei konstruktion |
|
|
"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
|
Posted: Thu Oct 02, 2003 8:10 am Post subject: Re: wegoptimimierung bei konstruktion |
|
|
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 |
|
 |
|
|
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
|
|