<?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[break; langsamer als exit() ?]]></title><description><![CDATA[<p>Servus Forum,</p>
<p>ich bin heute auf die Behauptung von jemandem gestoßen, dass ein break; das zum Programm-Ende führt ( siehe Code unten ) langsamer ist als ein direktes exit();</p>
<p>Folgende Situation im Blick:</p>
<pre><code class="language-cpp">.
.
.

/* main()-function */

while(true) {
   if ( someConditon ) {
      break; 
   }

   /* Lots of other stuff, like statements, other if-branches, etc. etc. */

}

return 0;
</code></pre>
<p>Wie Ihr seht wäre in dem Fall der erfüllten &quot;someCondition&quot; der Programm beendet, da hinter der while() Schleife direkt das return statement steht.</p>
<p>Ich dachte, dass das break; statement in dem Fall einfach - in Assembler übersetzt - ein jmp hinter den Körper der while-schleife ist. Somit dachte ich, dass es keinen Unterschied zu einem exit() call an gleicher Stelle bedeuten würde.</p>
<p>Allerdings wurde mir gesagt, dass in dem Fall des break; statements trotzdem noch jedes einzelne Statement darunter abgegrast wird - zwar im Sinne eines NOP, also leeren statements, aber bei meheren statements unter dem break; könnte das trotzdem ins Gewicht fallen.</p>
<p>Ich selber habe das mal getestet. Gleicher Aufbau wie oben, habe dafür gesorgt, dass someCondition == true ist und habe unter die if-verzweigung c.a 14k Zeilen einfach nur cout-statements und anderen Kram geballert. Trotzdem vergeht nicht mal eine Sekunde von Programmstart bis Programm-Ende.</p>
<p>Reichen diese 14k Zeilen Code darunter einfach noch nicht für 1ne Sekunde Unterschied oder verhält sich das gar nicht so wie es mir beschrieben wurde, in dem Fall von break; ?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/310354/break-langsamer-als-exit</link><generator>RSS for Node</generator><lastBuildDate>Tue, 04 Aug 2026 19:22:18 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/310354.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 09 Nov 2012 13:37:05 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to break; langsamer als exit() ? on Fri, 09 Nov 2012 13:37:05 GMT]]></title><description><![CDATA[<p>Servus Forum,</p>
<p>ich bin heute auf die Behauptung von jemandem gestoßen, dass ein break; das zum Programm-Ende führt ( siehe Code unten ) langsamer ist als ein direktes exit();</p>
<p>Folgende Situation im Blick:</p>
<pre><code class="language-cpp">.
.
.

/* main()-function */

while(true) {
   if ( someConditon ) {
      break; 
   }

   /* Lots of other stuff, like statements, other if-branches, etc. etc. */

}

return 0;
</code></pre>
<p>Wie Ihr seht wäre in dem Fall der erfüllten &quot;someCondition&quot; der Programm beendet, da hinter der while() Schleife direkt das return statement steht.</p>
<p>Ich dachte, dass das break; statement in dem Fall einfach - in Assembler übersetzt - ein jmp hinter den Körper der while-schleife ist. Somit dachte ich, dass es keinen Unterschied zu einem exit() call an gleicher Stelle bedeuten würde.</p>
<p>Allerdings wurde mir gesagt, dass in dem Fall des break; statements trotzdem noch jedes einzelne Statement darunter abgegrast wird - zwar im Sinne eines NOP, also leeren statements, aber bei meheren statements unter dem break; könnte das trotzdem ins Gewicht fallen.</p>
<p>Ich selber habe das mal getestet. Gleicher Aufbau wie oben, habe dafür gesorgt, dass someCondition == true ist und habe unter die if-verzweigung c.a 14k Zeilen einfach nur cout-statements und anderen Kram geballert. Trotzdem vergeht nicht mal eine Sekunde von Programmstart bis Programm-Ende.</p>
<p>Reichen diese 14k Zeilen Code darunter einfach noch nicht für 1ne Sekunde Unterschied oder verhält sich das gar nicht so wie es mir beschrieben wurde, in dem Fall von break; ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2269289</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2269289</guid><dc:creator><![CDATA[SomeoneWithAQuestion]]></dc:creator><pubDate>Fri, 09 Nov 2012 13:37:05 GMT</pubDate></item><item><title><![CDATA[Reply to break; langsamer als exit() ? on Fri, 09 Nov 2012 13:38:44 GMT]]></title><description><![CDATA[<p>SomeoneWithAQuestion schrieb:</p>
<blockquote>
<p>der Programm</p>
</blockquote>
<p>Gut von mir <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/2269292</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2269292</guid><dc:creator><![CDATA[SomeoneWithAQuestion]]></dc:creator><pubDate>Fri, 09 Nov 2012 13:38:44 GMT</pubDate></item><item><title><![CDATA[Reply to break; langsamer als exit() ? on Fri, 09 Nov 2012 13:41:54 GMT]]></title><description><![CDATA[<p>SomeoneWithAQuestion schrieb:</p>
<blockquote>
<p>Allerdings wurde mir gesagt, dass in dem Fall des break; statements trotzdem noch jedes einzelne Statement darunter abgegrast wird - zwar im Sinne eines NOP, also leeren statements, aber bei meheren statements unter dem break; könnte das trotzdem ins Gewicht fallen.</p>
</blockquote>
<p>Das ist Quatsch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2269296</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2269296</guid><dc:creator><![CDATA[nix_]]></dc:creator><pubDate>Fri, 09 Nov 2012 13:41:54 GMT</pubDate></item><item><title><![CDATA[Reply to break; langsamer als exit() ? on Fri, 09 Nov 2012 13:45:08 GMT]]></title><description><![CDATA[<p>Nach dem Verlassen einer Schleife durch break wird nichts mehr in der Schleife gemacht. Punkt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2269297</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2269297</guid><dc:creator><![CDATA[Rew.]]></dc:creator><pubDate>Fri, 09 Nov 2012 13:45:08 GMT</pubDate></item><item><title><![CDATA[Reply to break; langsamer als exit() ? on Fri, 09 Nov 2012 13:48:42 GMT]]></title><description><![CDATA[<blockquote>
<p>Allerdings wurde mir gesagt, dass in dem Fall des break; statements trotzdem noch jedes einzelne Statement darunter abgegrast wird</p>
</blockquote>
<p>Völliger Blödsinn.</p>
<p>Der Unterschied zwischen <code>return 0</code> (also in deinem Beispiel dem <code>break</code> ) und <code>exit(0)</code> ist der:</p>
<p>N3337 §3.6.1 / 4, <code>exit()</code></p>
<blockquote>
<p>Terminating the program without leaving the current block (e.g., by calling the function std::exit(int)<br />
(18.5)) does not destroy any objects with automatic storage duration (12.4).</p>
</blockquote>
<p>Und das <code>return</code> -Statement in der <code>main()</code> :<br />
N3337 §3.6.1 / 5</p>
<blockquote>
<p>A return statement in main has the effect of leaving the main function (destroying any objects with automatic<br />
storage duration) and calling std::exit with the return value as the argument.</p>
</blockquote>
<p>Man sieht also, das <code>return</code> Statement ist möglicherweise langsamer.</p>
<blockquote>
<p>Ich dachte, dass das break; statement in dem Fall einfach - in Assembler übersetzt - ein jmp hinter den Körper der while-schleife ist</p>
</blockquote>
<p>Damit kenne ich mich nicht aus, schätze aber dass man das Springen an sich hier vernachlässigen kann...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2269299</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2269299</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Fri, 09 Nov 2012 13:48:42 GMT</pubDate></item><item><title><![CDATA[Reply to break; langsamer als exit() ? on Fri, 09 Nov 2012 13:58:08 GMT]]></title><description><![CDATA[<p>Okay okay, dann hatt mich meine bisherige Vorstellung doch nicht getäuscht.</p>
<p>Dass das return eventuell langsamer als der exit-Befehl ist, nimmt man wahrscheinlich im Blick auf den Grund dafür gerne in Kauf <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":P"
      alt="😛"
    /></p>
<p>Auf jeden Fall Danke an Euch für die Aufklärung <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="😉"
    /> Mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2269306</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2269306</guid><dc:creator><![CDATA[SomeoneWithAQuestion]]></dc:creator><pubDate>Fri, 09 Nov 2012 13:58:08 GMT</pubDate></item><item><title><![CDATA[Reply to break; langsamer als exit() ? on Fri, 09 Nov 2012 13:59:58 GMT]]></title><description><![CDATA[<p>Wen interessiert schon, wieviele Nanosekunden das return(0) eventuell langsamer ist? Beende dein Programm einfach vernünftig und baue bloß nicht solche Pseudo-Optimierungen ein. <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/2269307</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2269307</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Fri, 09 Nov 2012 13:59:58 GMT</pubDate></item><item><title><![CDATA[Reply to break; langsamer als exit() ? on Fri, 09 Nov 2012 15:31:12 GMT]]></title><description><![CDATA[<p>_matze schrieb:</p>
<blockquote>
<p>Wen interessiert schon, wieviele Nanosekunden das return(0) eventuell langsamer ist? Beende dein Programm einfach vernünftig und baue bloß nicht solche Pseudo-Optimierungen ein. <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>
</blockquote>
<p>Das ist sogar AFAIR UB, oder? Falls Destruktoren nicht aufgerufen werden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2269342</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2269342</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Fri, 09 Nov 2012 15:31:12 GMT</pubDate></item><item><title><![CDATA[Reply to break; langsamer als exit() ? on Fri, 09 Nov 2012 15:36:02 GMT]]></title><description><![CDATA[<p>Wie kann ein beendetes Programm UB hervorrufen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2269343</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2269343</guid><dc:creator><![CDATA[AFAIR UB]]></dc:creator><pubDate>Fri, 09 Nov 2012 15:36:02 GMT</pubDate></item><item><title><![CDATA[Reply to break; langsamer als exit() ? on Fri, 09 Nov 2012 15:38:42 GMT]]></title><description><![CDATA[<p>AFAIR UB schrieb:</p>
<blockquote>
<p>Wie kann ein beendetes Programm UB hervorrufen?</p>
</blockquote>
<p>Stimmt, zu dem Zeitpunkt zu dem es beendet ist kann kein UB mehr auftreten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2269344</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2269344</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Fri, 09 Nov 2012 15:38:42 GMT</pubDate></item><item><title><![CDATA[Reply to break; langsamer als exit() ? on Fri, 09 Nov 2012 15:44:37 GMT]]></title><description><![CDATA[<p>SomeoneWithAQuestion schrieb:</p>
<blockquote>
<p>Ich dachte, dass das break; statement in dem Fall einfach - in Assembler übersetzt - ein jmp hinter den Körper der while-schleife ist.</p>
</blockquote>
<p>break; entspricht einem Short Jmp. Opcode: 0xEB</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

int main()
{
int e;
cin&gt;&gt;e;

        switch(e)
        {
        case 1:
                cout&lt;&lt;&quot;suung 1 &quot;;
        break;

        case 2:
                cout&lt;&lt;&quot;suung 2&quot;&lt;&lt;endl;
        break;

        case 3:
                cout&lt;&lt;&quot;sunng 3&quot;&lt;&lt;endl;
        break;

        }

system(&quot;PAUSE&quot;);
return 0; 
}
</code></pre>
<p>Disassembly:</p>
<pre><code class="language-asm">00401168 &gt; . 55             PUSH EBP
00401169   . 8BEC           MOV EBP,ESP
0040116B   . 51             PUSH ECX
0040116C   . 8D45 FC        LEA EAX,DWORD PTR SS:[EBP-4]
0040116F   . 50             PUSH EAX
00401170   . FF35 9C614000  PUSH DWORD PTR DS:[&lt;&amp;STLP45.#1090_@_STL@&gt;;  STLP45.@_STL@cin
00401176   . E8 7D000000    CALL Project2.@_STL@%basic_istream$c20_S&gt;
0040117B   . 83C4 08        ADD ESP,8
0040117E   . 8B55 FC        MOV EDX,DWORD PTR SS:[EBP-4]
00401181   . 4A             DEC EDX                                  ;  Switch (cases 1..3)
00401182   . 74 08          JE SHORT Project2.0040118C
00401184   . 4A             DEC EDX
00401185   . 74 1A          JE SHORT Project2.004011A1
00401187   . 4A             DEC EDX
00401188   . 74 3A          JE SHORT Project2.004011C4
0040118A   . EB 59          JMP SHORT Project2.004011E5
0040118C   &gt; 68 A4304000    PUSH Project2.004030A4                   ; /Arg2 = 004030A4 ASCII &quot;suung 1 &quot;; Case 1 of switch 00401181
00401191   . FF35 A0614000  PUSH DWORD PTR DS:[&lt;&amp;STLP45.#1091_@_STL@&gt;; |Arg1 = 003A8AD0
00401197   . E8 B4000000    CALL Project2.@_STL@$blsh$qr44_STL@%basi&gt;; \@_STL@$blsh$qr44_STL@%basic_ostream$c20_STL@%char_traits$c%%pxc$r44_STL@%basic_ostream$c20_STL@%char_traits$c%%
0040119C   . 83C4 08        ADD ESP,8
0040119F   . EB 44          JMP SHORT Project2.004011E5
004011A1   &gt; 68 48164000    PUSH Project2.@_STL@%endl$c20_STL@%char_&gt;;  Case 2 of switch 00401181
004011A6   . 68 AD304000    PUSH Project2.004030AD                   ; /Arg2 = 004030AD ASCII &quot;suung 2&quot;
004011AB   . FF35 A0614000  PUSH DWORD PTR DS:[&lt;&amp;STLP45.#1091_@_STL@&gt;; |Arg1 = 003A8AD0
004011B1   . E8 9A000000    CALL Project2.@_STL@$blsh$qr44_STL@%basi&gt;; \@_STL@$blsh$qr44_STL@%basic_ostream$c20_STL@%char_traits$c%%pxc$r44_STL@%basic_ostream$c20_STL@%char_traits$c%%
004011B6   . 83C4 08        ADD ESP,8
004011B9   . 50             PUSH EAX                                 ; |Arg1
004011BA   . E8 85000000    CALL Project2.@_STL@%basic_ostream$c20_S&gt;; \@_STL@%basic_ostream$c20_STL@%char_traits$c%%@$blsh$qpqr44_STL@%basic_ostream$c20_STL@%char_traits$c%%$r44_STL@%basic_ostream$c20_STL@%char_traits$c%%
004011BF   . 83C4 08        ADD ESP,8
004011C2   . EB 21          JMP SHORT Project2.004011E5
004011C4   &gt; 68 48164000    PUSH Project2.@_STL@%endl$c20_STL@%char_&gt;;  Case 3 of switch 00401181
004011C9   . 68 B5304000    PUSH Project2.004030B5                   ;  ASCII &quot;sunng 3&quot;
004011CE     FF             DB FF
004011CF     35             DB 35                                    ;  CHAR '5'
004011D0 &gt; . A0614000       DD &lt;&amp;STLP45.#1091_@_STL@cout&gt;
004011D4   . E8 77000000    CALL Project2.@_STL@$blsh$qr44_STL@%basi&gt;; \@_STL@$blsh$qr44_STL@%basic_ostream$c20_STL@%char_traits$c%%pxc$r44_STL@%basic_ostream$c20_STL@%char_traits$c%%
004011D9   . 83C4 08        ADD ESP,8
004011DC   . 50             PUSH EAX                                 ; |Arg1
004011DD   . E8 62000000    CALL Project2.@_STL@%basic_ostream$c20_S&gt;; \@_STL@%basic_ostream$c20_STL@%char_traits$c%%@$blsh$qpqr44_STL@%basic_ostream$c20_STL@%char_traits$c%%$r44_STL@%basic_ostream$c20_STL@%char_traits$c%%
004011E2   . 83C4 08        ADD ESP,8
004011E5   &gt; 68 BD304000    PUSH Project2.004030BD                   ; /command = &quot;PAUSE&quot;; Default case of switch 00401181
004011EA   . E8 AD130000    CALL &lt;JMP.&amp;CC3260._system&gt;               ; \_system
004011EF   . 59             POP ECX
004011F0   . 33C0           XOR EAX,EAX
004011F2   . 59             POP ECX
004011F3   . 5D             POP EBP
004011F4   . C3             RETN
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2269347</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2269347</guid><dc:creator><![CDATA[suung]]></dc:creator><pubDate>Fri, 09 Nov 2012 15:44:37 GMT</pubDate></item><item><title><![CDATA[Reply to break; langsamer als exit() ? on Fri, 09 Nov 2012 15:59:58 GMT]]></title><description><![CDATA[<p>suung schrieb:</p>
<blockquote>
<p>break; entspricht einem Short Jmp. Opcode: 0xEB</p>
</blockquote>
<p>tja, was soll ich sagen? hoffentlich taugt der wein den ich dieses jahr eingelagert hab mehr als die kommentare, sonst muss ich ihn wegschütten <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_down"
      title=":-1:"
      alt="👎"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2269351</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2269351</guid><dc:creator><![CDATA[oO]]></dc:creator><pubDate>Fri, 09 Nov 2012 15:59:58 GMT</pubDate></item><item><title><![CDATA[Reply to break; langsamer als exit() ? on Fri, 09 Nov 2012 18:19:04 GMT]]></title><description><![CDATA[<p>-.- Du glaubst es nicht oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2269402</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2269402</guid><dc:creator><![CDATA[suung]]></dc:creator><pubDate>Fri, 09 Nov 2012 18:19:04 GMT</pubDate></item><item><title><![CDATA[Reply to break; langsamer als exit() ? on Fri, 09 Nov 2012 18:24:24 GMT]]></title><description><![CDATA[<p>Hier ein Bild aus dem Debugger meiner IDE: <a href="http://www7.pic-upload.de/09.11.12/cej3g1y7jr5o.png" rel="nofollow">http://www7.pic-upload.de/09.11.12/cej3g1y7jr5o.png</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2269405</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2269405</guid><dc:creator><![CDATA[Suung]]></dc:creator><pubDate>Fri, 09 Nov 2012 18:24:24 GMT</pubDate></item><item><title><![CDATA[Reply to break; langsamer als exit() ? on Fri, 09 Nov 2012 18:56:17 GMT]]></title><description><![CDATA[<p>na prima. dann hab ich mich getäuscht... soll ja auch mal vorkommen <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2269415</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2269415</guid><dc:creator><![CDATA[oO]]></dc:creator><pubDate>Fri, 09 Nov 2012 18:56:17 GMT</pubDate></item><item><title><![CDATA[Reply to break; langsamer als exit() ? on Fri, 09 Nov 2012 19:28:30 GMT]]></title><description><![CDATA[<p>Ich kannte das von Opera (inzwischen passiert das nicht mehr). Wegen Flash und anderem Krams hatte Opera 2GB RAM auf einem Rechner belegt, der nur 1GB hatte. Da es aber auf die Festplatte ausgelagert wurde hat sich das nicht sonderlich auf die Performance ausgewirkt. Wenn man aber Opera geschlossen hat, dann hat er die ganzen 2 GB stückweise reingeswappt, nur um sie freizugeben. Das hat etwa eine Minute gedauert und ich hätte mir gewünscht, dass die einfach exit() aufrufen wenn man das Fenster schließt statt aus der main zurückzukehren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2269419</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2269419</guid><dc:creator><![CDATA[nwp3]]></dc:creator><pubDate>Fri, 09 Nov 2012 19:28:30 GMT</pubDate></item><item><title><![CDATA[Reply to break; langsamer als exit() ? on Fri, 09 Nov 2012 19:39:57 GMT]]></title><description><![CDATA[<p>auf der anderen seite machst du das auffinden von memleaks fast unmöglich, weil ein exit() nichts aufräumt und der counter dann sicher nicht auf 0 steht. außer das programm ist klein.</p>
<p>wie dumm von mir, wir haben ja schon geklärt, dass c++'ler keine memleaks produzieren <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/27a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--right_arrow"
      title=":arrow_right:"
      alt="➡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2269421</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2269421</guid><dc:creator><![CDATA[oO]]></dc:creator><pubDate>Fri, 09 Nov 2012 19:39:57 GMT</pubDate></item><item><title><![CDATA[Reply to break; langsamer als exit() ? on Fri, 09 Nov 2012 19:47:24 GMT]]></title><description><![CDATA[<p>Und wenn das Programm was systemglobales (z.B. Mutex) erzeugt, der dann wegen exit nicht wieder aufgeräumt wird? Oder wenn man auf einem Betriebssystem arbeitet, dass den Speicher eines Prozesses nicht automatisch bei Beenden freigibt? Die saubere Lösung ist return, Punkt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2269425</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2269425</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Fri, 09 Nov 2012 19:47:24 GMT</pubDate></item><item><title><![CDATA[Reply to break; langsamer als exit() ? on Fri, 09 Nov 2012 20:24:38 GMT]]></title><description><![CDATA[<p>.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2269431</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2269431</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Fri, 09 Nov 2012 20:24:38 GMT</pubDate></item><item><title><![CDATA[Reply to break; langsamer als exit() ? on Sat, 10 Nov 2012 01:33:14 GMT]]></title><description><![CDATA[<p>suung schrieb:</p>
<blockquote>
<p>SomeoneWithAQuestion schrieb:</p>
<blockquote>
<p>Ich dachte, dass das break; statement in dem Fall einfach - in Assembler übersetzt - ein jmp hinter den Körper der while-schleife ist.</p>
</blockquote>
<p>break; entspricht einem Short Jmp. Opcode: 0xEB</p>
</blockquote>
<p>Blah<br />
break; entspricht dem was der Compiler draus macht. Das kann alles mögliche sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2269469</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2269469</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 10 Nov 2012 01:33:14 GMT</pubDate></item><item><title><![CDATA[Reply to break; langsamer als exit() ? on Sat, 10 Nov 2012 01:36:11 GMT]]></title><description><![CDATA[<p>_matze schrieb:</p>
<blockquote>
<p>Und wenn das Programm was systemglobales (z.B. Mutex) erzeugt, der dann wegen exit nicht wieder aufgeräumt wird? Oder wenn man auf einem Betriebssystem arbeitet, dass den Speicher eines Prozesses nicht automatisch bei Beenden freigibt? Die saubere Lösung ist return, Punkt.</p>
</blockquote>
<p>Je nach System ist das vollkommen unproblematisch.<br />
Und die üblichen Systeme geben den Mist von Programmen frei die sich einfach so verabschieden.<br />
System-Resourcen aufräumen ist also meistens kein Problem.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2269470</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2269470</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 10 Nov 2012 01:36:11 GMT</pubDate></item><item><title><![CDATA[Reply to break; langsamer als exit() ? on Sat, 10 Nov 2012 06:54:19 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>_matze schrieb:</p>
<blockquote>
<p>Und wenn das Programm was systemglobales (z.B. Mutex) erzeugt, der dann wegen exit nicht wieder aufgeräumt wird? Oder wenn man auf einem Betriebssystem arbeitet, dass den Speicher eines Prozesses nicht automatisch bei Beenden freigibt? Die saubere Lösung ist return, Punkt.</p>
</blockquote>
<p>Je nach System ist das vollkommen unproblematisch.<br />
Und die üblichen Systeme geben den Mist von Programmen frei die sich einfach so verabschieden.<br />
System-Resourcen aufräumen ist also meistens kein Problem.</p>
</blockquote>
<p>Ist mir schon bewusst. Das war eher theoretisch betrachtet. Willst du hier eine Lanze für die exit-Variante brechen? <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/2269477</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2269477</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Sat, 10 Nov 2012 06:54:19 GMT</pubDate></item><item><title><![CDATA[Reply to break; langsamer als exit() ? on Sat, 10 Nov 2012 21:35:34 GMT]]></title><description><![CDATA[<p>_matze schrieb:</p>
<blockquote>
<p>Ist mir schon bewusst. Das war eher theoretisch betrachtet. Willst du hier eine Lanze für die exit-Variante brechen? <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>In gewisser Weise ja.<br />
Es gibt Fälle wo ich es für einen Fehler halte alles sauber aufzuräumen.<br />
Spontan fallen mir drei ein.</p>
<ol>
<li>
<p>Manchmal ist es sehr schwierig die korrekte Reihenfolge hinzubekommen in der Dinge freigegeben werden müssen. z.B. wenn man mit Singletons arbeitet. Ich bin zwar überhaupt kein Fan von Singletons (u.A. deswegen), aber es gibt auch Fälle wo man sich durch den Verzicht auf Singletons das Leben unnötig schwer macht. Manche Dinge ganz bewusst bei Programmende nicht freizugeben kann daher eine durchaus akzetable Lösung sein. Natürlich muss man aufpassen dass diese nicht-freigegebenen Dinge nichts wichtiges in ihrem Cleanup-Code machen. Wenn z.B. ein File offen ist, und der Cleanup-Code noch schnell gecachte Daten rausschreibt, dann sollte er auch aufgerufen werden. Wenn nur das File-Handle geschlossen wird kann man aber gerne darauf verzichten.</p>
</li>
<li>
<p>Bei bestimmten Fehlern sollten mMn. keine Destruktoren aufgerufen werden. Nämlich dann wenn Invarianten verletzt wurden oder sonstige &quot;assert-Artige&quot; Fehler auftreten. Also Dinge die &quot;eigentlich nicht passieren dürfen&quot;. Sich dann darauf zu verlassen dass der ganze Cleanup-Code nichts schlimmer macht als es bereits ist, ist mMn. oft ein Fehler.</p>
</li>
<li>
<p>Es gibt das Konzept der sog. &quot;crash only software&quot;. Wenn man seine Programme darauf auslegt, dass es nie irgendetwas gibt was beim Beenden noch schnell gespeichert/modifiziert/finalisiert/... werden müsste, dann besteht auch kein Grund alle Komponenten einzeln niederzufahren/aufzuräumen etc. In dem Fall kann man ruhig einfach exit() oder gar TerminateProcess() machen. Während des Entwickelns sollte man vermutlich trotzdem einen sauberen Shutdown-Pfad drinnen haben, z.B. um Leaks zu finden bzw. den Cleanup-Code von Komponenten zu testen (der ja trotzdem benötigt wird wenn bestimmte Komponenten während der Laufzeit aufgeräumt werden müssen).</p>
</li>
</ol>
]]></description><link>https://www.c-plusplus.net/forum/post/2269687</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2269687</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 10 Nov 2012 21:35:34 GMT</pubDate></item></channel></rss>