<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Objekt in Funktion Erzeugen und selbiges zurückgeben]]></title><description><![CDATA[<p>Mein Problem ist eigentlich ganz simpel. In einer Funktion möchte ich ein Objekt erzeugen, füttern und anschließend zurückgeben.<br />
Dabei soll es bei der Rückgabe nicht vernichtet werden. Sprich eine Kopie als Rückgabewert kommt aus Performancegründen nicht in Frage.</p>
<p>Es liegt also nahe eine Referenz zurückzugeben, allerdings kommt man hier nicht weiter, da das Objekt nur lokal ist.<br />
Ich bin auf static gestoßen, allerdings habe ich hier auch nicht die passende Lösung gefunden. So, wie ich es verstanden habe, bleibt ein static objekt dann im speicher, ohne, dass es gelöscht wird. Zudem wäre das Objekt dann einmalig. Man könnte sich nicht mehrere Objekte über diese Funktion erzeugen lassen.<br />
Zeiger will ich auch nicht verwenden, weil ich den Speicher danach nicht extra freigeben will.</p>
<p>Ganz konkret möchte ich den + Operator überladen. Dabei soll ein neues Objekt erzeugt und zurückgeben werden.<br />
Zum Üben habe ich eine Klasse MyDate geschrieben. Darin soll folgende Funktion vorkommen:</p>
<pre><code class="language-cpp">class MyDate {
public:
	//...
	MyDate operator +(int rhs);
	//...
};
</code></pre>
<p>Wenn ich also ein MyDate-Objekt mit einem Integer addiere, dann soll ein MyDate-Objekt (oder auch eine Referenz) zurückgegeben werden, dass r Tage entfernt liegt.</p>
<p>Wie gesagt möchte ich das in der Funktion erzeugte Objekt behalten und nicht kopieren. Es soll dann aber wie ein normales Objekt sterben, nur ein bisschen später:</p>
<pre><code class="language-cpp">{
	MyDate lhs = MyDate(1, 2, 2000) 	// 1.2.2000
	int rhs = 4;
	MyDate date = lhs + rhs; 		// Erzeugung von 5.2.2000
	//...
} //hier sollte das objekt, das in lhs.operator+(rhs) erzeugt wurde, sterben
</code></pre>
<p>Im Prinzip müsste + sich dann wie ein Constructor verhalten.</p>
<p>Ich bitte um elegante Lösungen<br />
Ich bedanke mich schon mal <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/203712/objekt-in-funktion-erzeugen-und-selbiges-zurückgeben</link><generator>RSS for Node</generator><lastBuildDate>Wed, 07 Oct 2026 20:02:47 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/203712.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 25 Jan 2008 16:07:30 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Objekt in Funktion Erzeugen und selbiges zurückgeben on Fri, 25 Jan 2008 16:07:30 GMT]]></title><description><![CDATA[<p>Mein Problem ist eigentlich ganz simpel. In einer Funktion möchte ich ein Objekt erzeugen, füttern und anschließend zurückgeben.<br />
Dabei soll es bei der Rückgabe nicht vernichtet werden. Sprich eine Kopie als Rückgabewert kommt aus Performancegründen nicht in Frage.</p>
<p>Es liegt also nahe eine Referenz zurückzugeben, allerdings kommt man hier nicht weiter, da das Objekt nur lokal ist.<br />
Ich bin auf static gestoßen, allerdings habe ich hier auch nicht die passende Lösung gefunden. So, wie ich es verstanden habe, bleibt ein static objekt dann im speicher, ohne, dass es gelöscht wird. Zudem wäre das Objekt dann einmalig. Man könnte sich nicht mehrere Objekte über diese Funktion erzeugen lassen.<br />
Zeiger will ich auch nicht verwenden, weil ich den Speicher danach nicht extra freigeben will.</p>
<p>Ganz konkret möchte ich den + Operator überladen. Dabei soll ein neues Objekt erzeugt und zurückgeben werden.<br />
Zum Üben habe ich eine Klasse MyDate geschrieben. Darin soll folgende Funktion vorkommen:</p>
<pre><code class="language-cpp">class MyDate {
public:
	//...
	MyDate operator +(int rhs);
	//...
};
</code></pre>
<p>Wenn ich also ein MyDate-Objekt mit einem Integer addiere, dann soll ein MyDate-Objekt (oder auch eine Referenz) zurückgegeben werden, dass r Tage entfernt liegt.</p>
<p>Wie gesagt möchte ich das in der Funktion erzeugte Objekt behalten und nicht kopieren. Es soll dann aber wie ein normales Objekt sterben, nur ein bisschen später:</p>
<pre><code class="language-cpp">{
	MyDate lhs = MyDate(1, 2, 2000) 	// 1.2.2000
	int rhs = 4;
	MyDate date = lhs + rhs; 		// Erzeugung von 5.2.2000
	//...
} //hier sollte das objekt, das in lhs.operator+(rhs) erzeugt wurde, sterben
</code></pre>
<p>Im Prinzip müsste + sich dann wie ein Constructor verhalten.</p>
<p>Ich bitte um elegante Lösungen<br />
Ich bedanke mich schon mal <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1443536</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1443536</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 25 Jan 2008 16:07:30 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt in Funktion Erzeugen und selbiges zurückgeben on Fri, 25 Jan 2008 16:31:08 GMT]]></title><description><![CDATA[<p>IMHO siehst Du hier Optimierungsbedarf wo (noch) keiner besteht. Deshalb wäre in meinen Augen die eleganteste Lösung eine der offensichtlichsten: Die operator+-Methode wird so implementiert, dass ein unnamed temporary zurückgegeben wird (oft ideal: return MyDate(*this) += arg) und der Compiler kann die Kopie eliminieren, wenn er die RVO durchführt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1443548</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1443548</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Fri, 25 Jan 2008 16:31:08 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt in Funktion Erzeugen und selbiges zurückgeben on Fri, 25 Jan 2008 16:41:11 GMT]]></title><description><![CDATA[<p>Funktionen, die Objekte erzeugen können sie auf 3 Weisen zurückgeben:</p>
<ol>
<li>Per Referenz auf ein static member. Wie du schon bemerkt hast, ist das zurückgegebene Objekt dann einmalig.</li>
<li>Per Zeiger. Es muss dann allerdings irgendwie dafuer gesorgt werden, dass das Objekt später wieder zerstört wird.</li>
<li>Per value. Zumindets in der Theorie beinhaltet das wenigstens einen Aufruf des Copy-Ctors</li>
</ol>
<p>Anders gehts nicht. ABER:<br />
Zu 2) Wenn die Funktion einen auto_ptr zurueckgibt, entfällt das delete, da dies vom auto_ptr selbst übernommen wird. Allerdings ist das gerade bei operator+ eher unüblich um nicht zu sagen unintuitiv und verwirrend.</p>
<p>Zu 3) Compiler können bei Rückgabewerten von Funktionen die Copy-Ctors wegoptimieren. Dabei ist wichtig, wie du deinen operato+ implementierst. Wenn das neu konstruierte Objekt in deiner Funktion ein temporäres Objekt ist, stehen die Chancen gut, dass der Compiler die Kopie vom lokalen Objekt ins Rückgabeobjekt eliminiert genauso wie die Kopie des Rückgabewerts an deine Variable, der du den Funktionswert zuweist. Ein wichtiger Schritt dazu ist, einen Operator+ immer durch den operator+= zu implementieren</p>
<p>bsp:</p>
<pre><code class="language-cpp">MyDate&amp; MyDate::operator+=(int i) 
{
  mDay += i;
  return *this;
}

MyDate MyDate::operator+(int i) //schlechtere version
{
  MyDate result(*this);  //1. Konstruktor
  result += i;
  return result; //2. Konsturktor, result wird an den Rückgabewert kopiert
}

MyDate MyDate::operator+(int i) //bessere version
{
  return MyDate(*this) += i; //Eine Konstruktion ist immer, aber die Kopie an den Rückgabewert kann eliminiert werden weils eine temporäre Variable ist.
}
</code></pre>
<p>Genauere Details zu dem Thema findest du auch in Meyers' (More) Effective C++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1443555</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1443555</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 25 Jan 2008 16:41:11 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt in Funktion Erzeugen und selbiges zurückgeben on Fri, 25 Jan 2008 16:54:07 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<p>(oft ideal: return MyDate(*this) += arg) und der Compiler kann die Kopie eliminieren, wenn er die RVO durchführt.</p>
</blockquote>
<p>Das ist gerade kein Fall, auf den RVO angewandt werden kann, denn des Argument von return ist kein temporäres Objekt sondern der Rückgabewert des überladenen += Operators, ein lvalue.<br />
Das ist bei der Implementation von + durch += u.a. immer so (ich hab vor kurzem einen etwas längeren Text geschrieben, warum das ohnehin keineswegs immer so optimal ist), NRVO kann man in der Regel einsetzen. Natürlich kann das Ergebnis auch bei diesem Konstrukt gleich ausfallen, aber dann müssen wir uns auf die as-if-Regel verlassen, die wirklich keinerlei Garantien hinsichtlich Optimierung bietet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1443559</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1443559</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 25 Jan 2008 16:54:07 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt in Funktion Erzeugen und selbiges zurückgeben on Fri, 25 Jan 2008 16:59:19 GMT]]></title><description><![CDATA[<p>Tatsache, Du hast (wie immer) recht. Leider ist mein EffC++ gerade ausser Haus und der MoreEffC++ ist noch eine Auflage aus prä-NRVO Zeiten, aber selbst in diesem alten Buch endet Meyers mit der benannten Variante, bei der die Möglichkeit der Optimierung zumindest besteht (mit der Fußnote, dass NRVO inzwischen möglich ist).</p>
<p>Damit hat sich pumuckls schlechtere Variante gerade zur besseren gemausert <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1443563</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1443563</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Fri, 25 Jan 2008 16:59:19 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt in Funktion Erzeugen und selbiges zurückgeben on Fri, 25 Jan 2008 17:02:47 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10648">@LordJaxom</a></p>
<p>da habe ich ein paar fragen<br />
wie soll der ausdruck</p>
<pre><code class="language-cpp">MyDate(*this) += arg
</code></pre>
<p>umgesetzt werden?</p>
<p>der += operator ist nicht definiert</p>
<p>außerdem wird mit MyDate(*this) wieder ein Objekt erzeugt, dass beim Rückgeben gleich wieder zerstört wird.<br />
das objekt, dass tatsächlich zurückgegeben wird, ist nur eine kopie<br />
gerade dass wollte ich nicht.</p>
<p>bei einem MyDate-Objekt ist das kopieren ja noch lange kein Performanceproblem</p>
<p>allerdings können andere Objekte später sehr viel größer werden. Diese dann zu kopieren, kann dann echt ziemlich belastend werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1443565</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1443565</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 25 Jan 2008 17:02:47 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt in Funktion Erzeugen und selbiges zurückgeben on Fri, 25 Jan 2008 17:07:14 GMT]]></title><description><![CDATA[<p>Deshalb erwähnte ich ja die RVO (ich hoffte Du suchst wenigstens mal danach, das heisst &quot;Return Value Optimization&quot;). Die hätte es möglich gemacht, die erwähnte Kopie zu eliminieren, was aber wie wir gerade gelernt haben nicht klappt. Damit bleibt noch die named Variante, da kannst Du evtl. einfach mal schauen was Dein Compiler daraus macht.</p>
<p>Zum operator+=, wenn der nicht da ist musst Du ihn natürlich vorher implementieren, da sollte eigentlich nichts gegen sprechen. Den operator+ auf Basis des operator+= zu implementieren ist eigentlich nur folgerichtig, da der Operator + auf niedrigstem Niveau sowieso als Kopie von links += rechts abgebildet wird (es seidenn man hat eine Dreiadressmaschine <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> )</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1443568</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1443568</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Fri, 25 Jan 2008 17:07:14 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt in Funktion Erzeugen und selbiges zurückgeben on Fri, 25 Jan 2008 17:20:21 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10648">@LordJaxom</a></p>
<p>sicherlich habe ich mal kurz unter rvo gegooglet, habe deine variante allerdings erstmal versucht auszuprobieren, bis ich feststellte, dass trotzdem ein neues objekt erzeugt und gleich darauf wieder zerstört wurde</p>
<p>lieg ich da richtig, dass die rvo in speziellen fällen dafür sorgt, dass statt einer kopie eines temporären objektes, dass temporäre objekt selber übergeben wird?</p>
<p>ich habe folgendes ausprobiert:</p>
<pre><code class="language-cpp">#include&lt;iostream&gt;

using namespace std;

class X {
public:
	int n;
	X(int n) {
		this-&gt;n = n;
	}
	~X() {
		cout &lt;&lt; &quot;vernichte &quot; &lt;&lt; this &lt;&lt; endl;
	}
	X operator +=(int rhs) {
		n += rhs;
		return *this;
	}
	X operator +(int rhs) {
		return X(*this) += rhs;
	}
};

int main()
{
	X x = X(2);
	X z = x + 3;
	cin.get();
}
</code></pre>
<p>bevor ich aber zum cin.get() komme, wird bereits ein objekt von X zerstört<br />
gerade das wollte ich nicht. bis zum cin sollen nur zwei objekte erzeugt werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1443573</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1443573</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 25 Jan 2008 17:20:21 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt in Funktion Erzeugen und selbiges zurückgeben on Fri, 25 Jan 2008 17:39:10 GMT]]></title><description><![CDATA[<p>In Deinem Code ist ein kleiner Fehler enthalten: Der operator+= muss eine Referenz zurückgeben, sonst würde ja das Ergebnis kopiert. x += y gibt aber x zurück.</p>
<p>Ansonsten hast Du weiterhin recht, dass hier nicht optimiert wird. Deshalb ja auch &quot;schau mal, was Dein Compiler zur benannten Variante sagt&quot;. Folgenden Quellcode quittiert der Microsoft VC++ 8.0 im Release-Modus mit &quot;erzeuge, kopiere, vernichte, vernichte&quot;. Hier ist keine überflüssige Kopie vorhanden. (Den operator= habe ich gerade auch noch kurz reingebracht, wird nicht aufgerufen)</p>
<pre><code class="language-cpp">class X { 
public: 
    int n; 
	X(int n) : n(n) { cout &lt;&lt; &quot;erzeuge &quot; &lt;&lt; this &lt;&lt; endl; }
	X(X const&amp; x) : n(x.n) { cout &lt;&lt; &quot;kopiere &quot; &lt;&lt; this &lt;&lt; &quot; aus &quot; &lt;&lt; &amp;x &lt;&lt; endl; }
    ~X() { cout &lt;&lt; &quot;vernichte &quot; &lt;&lt; this &lt;&lt; endl; } 
    X&amp; operator +=(int rhs) { 
        n += rhs; 
        return *this; 
    } 
    X operator +(int rhs) { 
		X x(*this);
		x += rhs;
        return x;
    } 
}; 

int main() 
{ 
    X x = X(2); 
    X z = x + 3; 
    cin.get(); 
}
</code></pre>
<p>EDIT:<br />
Das Kompilat vom gcc in der Version 3.3.5 erzeugt aus dieser Variante sogar ohne explizite Optimierungsflags die o.a. Ausgabe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1443580</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1443580</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Fri, 25 Jan 2008 17:39:10 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt in Funktion Erzeugen und selbiges zurückgeben on Fri, 25 Jan 2008 18:46:37 GMT]]></title><description><![CDATA[<p>okay, ich danke. soweit ist das problem dann gelöst.</p>
<p>aber warum kommt es im release mode zu einer ausgabe wie z.B.</p>
<p>erzeuge 0012FF6C<br />
kopiere 0012FF70 aus 0012FF6C</p>
<p>vernichte 0012FF70<br />
vernichte 0012FF6C</p>
<p>und im debug mode zu:</p>
<p>erzeuge 0012FF54<br />
kopiere 0012FE44 aus 0012FF54<br />
kopiere 0012FF48 aus 0012FE44<br />
vernichte 0012FE44</p>
<p>vernichte 0012FF48<br />
vernichte 0012FF54</p>
<p>wird das rvo im debug mode nicht angewandt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1443617</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1443617</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 25 Jan 2008 18:46:37 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt in Funktion Erzeugen und selbiges zurückgeben on Fri, 25 Jan 2008 18:59:28 GMT]]></title><description><![CDATA[<p>Im Debug-Mode sind üblicherweise (fast) alle Optimierungen ausgeschaltet. Das macht das Debuggen einfacher, denn wie soll man den Inhalt einer temporären Variable überprüfen, wenn sie bereits wegoptimiert wurde. Die meisten Optimierungen behindern das Debuggen. Das führt allerdings dazu, dass man im Debugmodus noch nicht entscheiden kann, welche Teile im Programm performancekritisch sind.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1443633</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1443633</guid><dc:creator><![CDATA[Don06]]></dc:creator><pubDate>Fri, 25 Jan 2008 18:59:28 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt in Funktion Erzeugen und selbiges zurückgeben on Fri, 25 Jan 2008 19:06:00 GMT]]></title><description><![CDATA[<blockquote>
<p>wird das rvo im debug mode nicht angewandt?</p>
</blockquote>
<p>Bingo <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1443640</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1443640</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 25 Jan 2008 19:06:00 GMT</pubDate></item></channel></rss>