<?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[Suche gute Stringfunktion]]></title><description><![CDATA[<p>Hi,</p>
<p>ich habe folgendes Problem immer wieder und finde einfach keine gescheite Lösung.</p>
<p>Es geht um eine Funktion, die einen String (dessen Größe erst zur Laufzeit bekannt wird, also einen allokierten String) zurückgeben soll... dies könnte ja auf 3 verschiedene Arten gemacht werden:</p>
<p>1.) char* func(...)<br />
Als erfahrener C-Programmierer <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="😉"
    /> weiß ich aber, dass man dann immer wieder vergisst, den Speicher freizugebene <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":-/"
      alt="😕"
    /></p>
<p>2.) string func(...)<br />
Eigentlich eine recht gute Lösung (und ic denke die beste)... Hat nur einen entscheidenden Nachteil: Die Funktion erstellt einen String, der dann mit return zurückgegeben wird. An der Stelle des Funktionsaufrufs wird ein neuer String erstellt - also 2 Strings - ein großer Laufzeitnachteil!</p>
<p>3.) auto_ptr/smart_ptr auf char zurückgeben ... die haben aber auch ihre Tücken (wenn man eine Funktion mit der Kopie eines auto_ptr aufruft, hat der eigtl. auto_ptr keinen Inhalt mehr <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /> )</p>
<p>Eine Alternative: Man erzeugt immer statt einer Funktion ein Objekt, dass einen std::string hat ... man wäre die Probleme aus Punkt 2 los - is aber nen großer Aufwand...</p>
<p>Wie stellt ihr euch eine sinnvolle Funktion vor?<br />
Greeeez!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/203729/suche-gute-stringfunktion</link><generator>RSS for Node</generator><lastBuildDate>Wed, 07 Oct 2026 19:03:57 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/203729.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 25 Jan 2008 19:15:28 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Suche gute Stringfunktion on Fri, 25 Jan 2008 19:15:28 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich habe folgendes Problem immer wieder und finde einfach keine gescheite Lösung.</p>
<p>Es geht um eine Funktion, die einen String (dessen Größe erst zur Laufzeit bekannt wird, also einen allokierten String) zurückgeben soll... dies könnte ja auf 3 verschiedene Arten gemacht werden:</p>
<p>1.) char* func(...)<br />
Als erfahrener C-Programmierer <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="😉"
    /> weiß ich aber, dass man dann immer wieder vergisst, den Speicher freizugebene <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":-/"
      alt="😕"
    /></p>
<p>2.) string func(...)<br />
Eigentlich eine recht gute Lösung (und ic denke die beste)... Hat nur einen entscheidenden Nachteil: Die Funktion erstellt einen String, der dann mit return zurückgegeben wird. An der Stelle des Funktionsaufrufs wird ein neuer String erstellt - also 2 Strings - ein großer Laufzeitnachteil!</p>
<p>3.) auto_ptr/smart_ptr auf char zurückgeben ... die haben aber auch ihre Tücken (wenn man eine Funktion mit der Kopie eines auto_ptr aufruft, hat der eigtl. auto_ptr keinen Inhalt mehr <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /> )</p>
<p>Eine Alternative: Man erzeugt immer statt einer Funktion ein Objekt, dass einen std::string hat ... man wäre die Probleme aus Punkt 2 los - is aber nen großer Aufwand...</p>
<p>Wie stellt ihr euch eine sinnvolle Funktion vor?<br />
Greeeez!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1443647</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1443647</guid><dc:creator><![CDATA[voidpointer]]></dc:creator><pubDate>Fri, 25 Jan 2008 19:15:28 GMT</pubDate></item><item><title><![CDATA[Reply to Suche gute Stringfunktion on Fri, 25 Jan 2008 19:18:21 GMT]]></title><description><![CDATA[<blockquote>
<p>Die Funktion erstellt einen String, der dann mit return zurückgegeben wird. An der Stelle des Funktionsaufrufs wird ein neuer String erstellt - also 2 Strings - ein großer Laufzeitnachteil!</p>
</blockquote>
<p>Falsch!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1443653</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1443653</guid><dc:creator><![CDATA[ö]]></dc:creator><pubDate>Fri, 25 Jan 2008 19:18:21 GMT</pubDate></item><item><title><![CDATA[Reply to Suche gute Stringfunktion on Fri, 25 Jan 2008 19:20:02 GMT]]></title><description><![CDATA[<p>Man könnte auch einen string* zurückliefern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1443657</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1443657</guid><dc:creator><![CDATA[Ramsis]]></dc:creator><pubDate>Fri, 25 Jan 2008 19:20:02 GMT</pubDate></item><item><title><![CDATA[Reply to Suche gute Stringfunktion on Fri, 25 Jan 2008 19:20:13 GMT]]></title><description><![CDATA[<p>moment ...</p>
<pre><code class="language-cpp">string new_str = func();
</code></pre>
<p>da wird doch der operator=() aufgerufen, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1443658</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1443658</guid><dc:creator><![CDATA[voidpointer]]></dc:creator><pubDate>Fri, 25 Jan 2008 19:20:13 GMT</pubDate></item><item><title><![CDATA[Reply to Suche gute Stringfunktion on Fri, 25 Jan 2008 19:26:19 GMT]]></title><description><![CDATA[<p>Ramsis schrieb:</p>
<blockquote>
<p>Man könnte auch einen string* zurückliefern.</p>
</blockquote>
<p>Ja, aber dann müsste ich den string in der Funktion static machen, und beim nächsten Aufruf der Funktion... was würde dann unangenehmes passieren? der alte String geht verloren?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1443665</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1443665</guid><dc:creator><![CDATA[voidpointer]]></dc:creator><pubDate>Fri, 25 Jan 2008 19:26:19 GMT</pubDate></item><item><title><![CDATA[Reply to Suche gute Stringfunktion on Fri, 25 Jan 2008 19:28:55 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>voidpointer schrieb:</p>
<blockquote>
<p>moment ...</p>
<pre><code class="language-cpp">string new_str = func();
</code></pre>
<p>da wird doch der operator=() aufgerufen, oder?</p>
</blockquote>
<p>Nicht unbedingt. Siehe das hier schon oft besprochene RVO.</p>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1443667</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1443667</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Fri, 25 Jan 2008 19:28:55 GMT</pubDate></item><item><title><![CDATA[Reply to Suche gute Stringfunktion on Fri, 25 Jan 2008 19:38:38 GMT]]></title><description><![CDATA[<p>voidpointer schrieb:</p>
<blockquote>
<p>2.) string func(...)<br />
Eigentlich eine recht gute Lösung (und ic denke die beste)... Hat nur einen entscheidenden Nachteil: Die Funktion erstellt einen String, der dann mit return zurückgegeben wird. An der Stelle des Funktionsaufrufs wird ein neuer String erstellt - also 2 Strings - ein großer Laufzeitnachteil!</p>
</blockquote>
<p>Dafür gibt es RVO. Anders sieht das bei Zuweisung aus, aber auch dafür gibt es Lösungen (und mit C++0x bekommen wir ohnehin Movekonstruktoren und eine brauchbare Lösung für das forwarding-Problem).</p>
<blockquote>
<p>3.) auto_ptr/smart_ptr auf char zurückgeben ... die haben aber auch ihre Tücken (wenn man eine Funktion mit der Kopie eines auto_ptr aufruft, hat der eigtl. auto_ptr keinen Inhalt mehr <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /> )</p>
</blockquote>
<p>Keine echte Alternative. auto_ptr fällt aus, da dieses nicht mit Arrays umgehen kann. Prinzipiell ist es möglich ein alternatives auto_array zu erstellen (das ist sogar einfacher, weil man keine Pointerkonvertierungen berücksichtigen muss - die Tatsache der Übernahme des Ownerships ist im Übrigen die Existenzberechtigung für auto_ptr und weniger eine Tücke, natürlich ist es keine eierlegende Wollmilchsau, die plötzlich alle Probleme der Parameterübergabe löst). Ein anderer Smartpointer, der mit Arrays umgehen kann, ist möglich, aber ein rohes Array ist kein echter String. Wenn ein String das ist, was die Funktion zurückgeben soll, dann ist es falsch, umständlich etwas Anderes zurückzugeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1443675</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1443675</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 25 Jan 2008 19:38:38 GMT</pubDate></item><item><title><![CDATA[Reply to Suche gute Stringfunktion on Fri, 25 Jan 2008 20:00:34 GMT]]></title><description><![CDATA[<p>RVO - Return Value Optimization...</p>
<p><a href="http://www.cs.cmu.edu/~gilpin/c++/performance.html#returnvalue" rel="nofollow">http://www.cs.cmu.edu/~gilpin/c++/performance.html#returnvalue</a></p>
<p>Sieht also schlecht aus! Wenn ich das richtig sehe, lässt sich das nur so lösen, dass man vorher schon bei den parametern einen stringpointer übergibt, wo der string dann rein geschrieben wird?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1443691</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1443691</guid><dc:creator><![CDATA[voidpointer]]></dc:creator><pubDate>Fri, 25 Jan 2008 20:00:34 GMT</pubDate></item><item><title><![CDATA[Reply to Suche gute Stringfunktion on Fri, 25 Jan 2008 20:06:04 GMT]]></title><description><![CDATA[<p>Siehe auch <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-203712.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-t-is-203712.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1443694</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1443694</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Fri, 25 Jan 2008 20:06:04 GMT</pubDate></item><item><title><![CDATA[Reply to Suche gute Stringfunktion on Fri, 25 Jan 2008 20:12:13 GMT]]></title><description><![CDATA[<p>voidpointer schrieb:</p>
<blockquote>
<p>RVO - Return Value Optimization...</p>
<p><a href="http://www.cs.cmu.edu/~gilpin/c++/performance.html#returnvalue" rel="nofollow">http://www.cs.cmu.edu/~gilpin/c++/performance.html#returnvalue</a></p>
<p>Sieht also schlecht aus! Wenn ich das richtig sehe, lässt sich das nur so lösen, dass man vorher schon bei den parametern einen stringpointer übergibt, wo der string dann rein geschrieben wird?</p>
</blockquote>
<p>Welches Problem vermeinst du eigentlich lösen zu müssen? Obwohl sie für gewöhnlich RVO heißt, hat die Regel, die damit gemeint ist, nicht speziell etwas mit der Rückgabe von Funktionswerten zu tun (ganz im Gegensatz zu NRVO).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1443697</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1443697</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 25 Jan 2008 20:12:13 GMT</pubDate></item><item><title><![CDATA[Reply to Suche gute Stringfunktion on Fri, 25 Jan 2008 20:24:43 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/6642">@Camper</a>: Ich möchte eben auch einen schönen Funktionsaufruf haben:</p>
<pre><code class="language-cpp">string func(...);
</code></pre>
<p>ist handlicher als</p>
<pre><code class="language-cpp">void func(string* s, ...);
</code></pre>
<p>Wenn ich diesen Thread richtig lese, wird also hauptsächlich daszu geraten, den konstruktor erst beim return aufzurufen?</p>
<pre><code class="language-cpp">int func() {
//...
return string(...);
}
</code></pre>
<p>Wie hoch sind die Chancen, dass ein moderner Compiler das richtig macht? Kann ein inline die Chance erhöhen?</p>
<p>Und btw: was haltet ihr von Makros? Da optimiert der Prekompiler schon alles <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/1443707</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1443707</guid><dc:creator><![CDATA[voidpointer]]></dc:creator><pubDate>Fri, 25 Jan 2008 20:24:43 GMT</pubDate></item><item><title><![CDATA[Reply to Suche gute Stringfunktion on Fri, 25 Jan 2008 20:38:19 GMT]]></title><description><![CDATA[<p>voidpointer schrieb:</p>
<blockquote>
<p>1.) char* func(...)<br />
Als erfahrener C-Programmierer <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="😉"
    /> weiß ich aber, dass man dann immer wieder vergisst, den Speicher freizugebene <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":-/"
      alt="😕"
    /></p>
</blockquote>
<p>der erfahrene c-programmierer gibt der funktion einen string, den sie füllen kann:</p>
<pre><code>void func (char *str, size_t max)
{
  ...
}
...
char str[...];
func (str, sizeof(str));
...
</code></pre>
<p>in c++ kannste sowas ähnliches machen:</p>
<pre><code>void func (std::string &amp;str)
{
  ...
}
...
std::string s;
func (s);
...
</code></pre>
<p>ohne laufzeiteinbussen durch copy-konstruktoren und heap-aktionen (ausser dass so'n std::string selber auf dem heap rumeiert).<br />
<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/1443712</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1443712</guid><dc:creator><![CDATA[char*-freak]]></dc:creator><pubDate>Fri, 25 Jan 2008 20:38:19 GMT</pubDate></item><item><title><![CDATA[Reply to Suche gute Stringfunktion on Fri, 25 Jan 2008 21:10:45 GMT]]></title><description><![CDATA[<p>voidpointer schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/6642">@Camper</a>: Ich möchte eben auch einen schönen Funktionsaufruf haben:</p>
<pre><code class="language-cpp">string func(...);
</code></pre>
<p>ist handlicher als</p>
<pre><code class="language-cpp">void func(string* s, ...);
</code></pre>
</blockquote>
<p>genau.</p>
<blockquote>
<p>Wenn ich diesen Thread richtig lese, wird also hauptsächlich daszu geraten, den konstruktor erst beim return aufzurufen?</p>
</blockquote>
<p>Das wurde hier nirgendwo gesagt. Wie du das Funktionsergebnis innerhalb deiner Funktion berechnest, hat nichts damit zu tun, wie man unnötige Kopien bei der Übergabe von Rückgabewerten vermeidet - außer das RVO zur Vermeidung der Kopie des Rückgabewertes nur in Frage kommt, wenn das Argument von return selbst ein temporäres Objekt ist. Letzteres ist vor allem dann der Fall, wenn das Ergebnis durch einen Funktionsaufruf ensteht (in diesem Falle stellt sich nat. wieder die Frage, wie diese andere Funktion optimal zu schreiben ist) oder durch einen Konstruktoraufruf (ok, das ist auch ein Funktionsaufruf, aber wir haben hier explizit die Möglichkeit, in die Konstruktion einzugreifen).</p>
<blockquote>
<pre><code class="language-cpp">int func() {
//...
return string(...);
}
</code></pre>
<p>Wie hoch sind die Chancen, dass ein moderner Compiler das richtig macht? Kann ein inline die Chance erhöhen?</p>
</blockquote>
<p>Sehr hoch (99.9999%, denn diese Optimierung ist für den Compiler trivial durchzuführen), aber häufig ist diese Form gar nicht möglich, oder nur, wenn man einen bereits konstruierten String noch einmal kopiert (und diese explizite Kopie kann dann nicht eliminiert werden). Wichtig wird hier NRVO. Wenn das return-Statement ein lokales automatisches Objekt bennent, darf der Compiler die Kopie eliminieren (indem das lokale Objekt von vornherein in dem Speicher, der für das Rückgabeobjekt vorgesehen ist, konstruiert wird). Die Chancen dafür sind bei einem modernen Compiler ebenfalls sehr hoch, wenn man entsprechend strukturiert (die Regel selbst stellt eigentlich keine besonderen Bedingungen, aber eine Verletzung der folgenden Regel - die ich selbst aufgestellt habe - stellt erhöhte Anforderungen an den Compiler):<br />
Ein return-Statement:</p>
<pre><code class="language-cpp">return x;
</code></pre>
<p>kann dann optimiert werden, wenn sich innerhalb des potentiellen Scopes von x kein (erreichbares) return-Statement befindet, das nicht x benennt. Warum das so ist, kannst du dir selber überlegen:</p>
<pre><code class="language-cpp">T foo()
{
    if ( ... )
    {
        if ( ... )
            return T(...); // unschädlich
        T x;
        if ( ... )
            return x;
        if ( ... )
            return T(...); // schädlich, verhindert Optimierung von return x, aber dieses return kann durch RVO optimiert werden
    }
    return T( ... ); // unschädlich
}
</code></pre>
<p>Funktionsparamter sind ein spezieller Fall: im Prinzip gilt diese Regel auch für sie, aber ich kenne keinen Compiler, der das tatsächlich durchführt - der Grund ist klar: die Funktionsparameter werden durch den Aufrufer erzeugt.</p>
<blockquote>
<p>Und btw: was haltet ihr von Makros? Da optimiert der Prekompiler schon alles <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>
</blockquote>
<p>gar nichts. Und der Präcompiler optimiert auch gar nicht.</p>
<p>Eine zweite Kopieraktion steht an, wenn der Rückgabewert der Funktion im aufrufenden Ausdruck kopiert werden soll. Wenn diese Kopieraktion der Initialisierung eines Objektes dient, greift hier RVO ein. Problematisch ist dagegen Zuweisung, die kann der Compiler natürlich nicht wegoptimieren, denn der ursprüngliche Inhalt des Objektes, dem zugewiesen wird, bedarf ja möglicher bestimmter Aufräumaktionen (außer nat. die Zuweisung ist trivial, in diesem Falle hilft ggf. die as-if-Regel; aber die ist wenig hilfreich, wenn wir diskutieren, wie optimaler Code geschrieben werden muss). Wie schon erwähnt, mit Movekonstruktoren und Move-Zuweisung wird dieses Problem in C++0x gut handhabbar sein, mit der gegenwärtigen Sprache, kann man ggf. auf swap ausweichen - auch wenn es nicht besonders schön ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1443732</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1443732</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 25 Jan 2008 21:10:45 GMT</pubDate></item><item><title><![CDATA[Reply to Suche gute Stringfunktion on Fri, 25 Jan 2008 21:30:19 GMT]]></title><description><![CDATA[<p>std::string ist eine Katastrophe für die Laufzeit <strong>wenn es darauf ankommt. Meistens ist es aber total wurscht.</strong> Viele Programmierer machen den Fehler sich über die Geschwindigkeit von Stellen in einem Programm den Kopf zu zerbrechen, wo die Geschwindigkeit vollkommen egal ist. Bei vielen Programmen gibt es nichtmal irgendwelche Stellen wo es sich auszahlen würde sich über die Geschwindigkeit Sorgen zu machen.</p>
<blockquote>
<p>Wie hoch sind die Chancen, dass ein moderner Compiler das richtig macht?</p>
</blockquote>
<p>Sehr sehr hoch (auf (N)RVO bezogen).</p>
<blockquote>
<p>Kann ein inline die Chance erhöhen?</p>
</blockquote>
<p>AFAIK nicht wirklich. Inline erlaubt den meisten Compilern andere, zusätzliche Optimierungen zu machen als (N)RVO. Solche anderen Optimierungen und (N)RVO sind auch zwei Paar Schuhe, zwei ganz unterschiedliche. (N)RVO ist im Standard festgeschrieben, und erlaubt das Weglassen von Kopien unter bestimmten Umständen, selbst wenn sich dabei das sichtbare Verhalten des Programmes ändert (!). Andere Optimierungen können nur gemacht werden wenn das sichtbare Verhalten des Programmes sich dadurch nicht ändert.</p>
<p>Eine Sache die Compiler grundsätzlich daran hindert ein Stück Code wegzuoptimieren ist der Aufruf von Funktionen deren Implementierung der Compiler nicht kennt, da er davon ausgehen muss dass die Ausführung so einer Funktion &quot;beobachtbar&quot; wäre. Schliesslich könnte so eine Funktion ja was am Bildschirm ausgeben oder sonstwas machen. Leider fallen bei vielen Compilern (oder sogar bei allen?) auch die Funktionen &quot;new&quot; und &quot;delete&quot; in diese Kategorie, selbst wenn der User diese nicht redefiniert.<br />
Das führt dazu dass folgendes nicht optimiert werden kann:</p>
<pre><code class="language-cpp">void foo()
{
    char* ch = new char; // jeder Blinde sieht dass das hier genau garnix tut,
    delete ch; // allerdings checkt das kein mir bekannter Compiler
    // Ergebnis: die Aufrufe von &quot;new&quot; und &quot;delete&quot; werden nicht wegoptimiert
}
</code></pre>
<blockquote>
<p>Und btw: was haltet ihr von Makros?</p>
</blockquote>
<p>In dem Zusammenhang sehr wenig.</p>
<blockquote>
<p>Da optimiert der Prekompiler schon alles</p>
</blockquote>
<p>Der optimiert garnix. Makros können bloss verwendet werden um Copy &amp; Paste wie einen Funktionsaufruf aussehen zu lassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1443746</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1443746</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 25 Jan 2008 21:30:19 GMT</pubDate></item></channel></rss>