<?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[Frage zu Variablen in switch-case und Perfromance]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich hab ne Frage bezüglich des switch-case statements und Variablendeklaration in diesen. Folgendes ist ja nicht erlaubt:</p>
<pre><code>// Variante 1
switch (state) {
    case STATE_FIRST:
        int test = 0; // Fehler
        break;
}
</code></pre>
<p>Das kann man jetzt natürlich so lösen:</p>
<pre><code>// Variante 2
switch (state) {
    case STATE_FIRST: {
                        int test = 0; // Kein Fehler
        }
        break;
}
</code></pre>
<p>Was ich allerdings optisch ziemlich hässlich finde. Vor allem weil VS die Einrückung dann immer kaputt macht (int test wird extrem weit nach rechts geschoben).</p>
<p>Wenn ich das so mache:</p>
<pre><code>// Variante 3
int test;

switch (state) {
    case STATE_FIRST:
        test = 0; // Kein Fehler
        break;
}
</code></pre>
<p>würde es besser aussehen. Allerdings wird dieser Code sehr oft aufgerufen, wobei STATE_FIRST allerdings nur sehr selten erfüllt ist, die Variable test also in mehr als 99% der Fälle nicht benötigt wird.</p>
<p>Daher meine Frage jetzt: Ist Variante 3 langsamer als Variante 2? Also kostet so eine Variable auch dann Performance wenn sie nichtmal initialisiert wird? Oder checkt der Compiler sowas von alleine?</p>
<p>Schöne Grüße,<br />
hs</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/323279/frage-zu-variablen-in-switch-case-und-perfromance</link><generator>RSS for Node</generator><lastBuildDate>Thu, 16 Jul 2026 06:54:23 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/323279.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 24 Jan 2014 10:52:26 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zu Variablen in switch-case und Perfromance on Fri, 24 Jan 2014 10:52:59 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich hab ne Frage bezüglich des switch-case statements und Variablendeklaration in diesen. Folgendes ist ja nicht erlaubt:</p>
<pre><code>// Variante 1
switch (state) {
    case STATE_FIRST:
        int test = 0; // Fehler
        break;
}
</code></pre>
<p>Das kann man jetzt natürlich so lösen:</p>
<pre><code>// Variante 2
switch (state) {
    case STATE_FIRST: {
                        int test = 0; // Kein Fehler
        }
        break;
}
</code></pre>
<p>Was ich allerdings optisch ziemlich hässlich finde. Vor allem weil VS die Einrückung dann immer kaputt macht (int test wird extrem weit nach rechts geschoben).</p>
<p>Wenn ich das so mache:</p>
<pre><code>// Variante 3
int test;

switch (state) {
    case STATE_FIRST:
        test = 0; // Kein Fehler
        break;
}
</code></pre>
<p>würde es besser aussehen. Allerdings wird dieser Code sehr oft aufgerufen, wobei STATE_FIRST allerdings nur sehr selten erfüllt ist, die Variable test also in mehr als 99% der Fälle nicht benötigt wird.</p>
<p>Daher meine Frage jetzt: Ist Variante 3 langsamer als Variante 2? Also kostet so eine Variable auch dann Performance wenn sie nichtmal initialisiert wird? Oder checkt der Compiler sowas von alleine?</p>
<p>Schöne Grüße,<br />
hs</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2379294</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2379294</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Fri, 24 Jan 2014 10:52:59 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Variablen in switch-case und Perfromance on Fri, 24 Jan 2014 11:03:28 GMT]]></title><description><![CDATA[<p>was hälst Du davon:</p>
<pre><code>switch( state )
{
    case XYZ:
    {
        int hello;
        ....
        break;
    }
    case ...
}
</code></pre>
<p>Zu Deinen Performazüberlegungen: Es sollte wurscht sein, wo Du Deine Variable deklariert, solange sie nicht konstruiert werden muß.</p>
<p>mfg Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2379295</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2379295</guid><dc:creator><![CDATA[mgaeckler]]></dc:creator><pubDate>Fri, 24 Jan 2014 11:03:28 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Variablen in switch-case und Perfromance on Fri, 24 Jan 2014 11:47:34 GMT]]></title><description><![CDATA[<p>Wenn es sich wie hier um ein int (oder sonstige fundamentale Datentypen handelt) sieht der generiert Code höchstwahrscheinlich genau gleich aus. Dass VS den Kram so weit nach rechts schiebt kann ich allerdings nicht nachvollziehen, bei mir sieht das ganz normal aus:</p>
<pre><code>switch (foo)
{
case bar:
    {
        int i = 0;
        break;
    }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2379296</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2379296</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Fri, 24 Jan 2014 11:47:34 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Variablen in switch-case und Perfromance on Fri, 24 Jan 2014 11:25:24 GMT]]></title><description><![CDATA[<p>mgaeckler schrieb:</p>
<blockquote>
<p>was hälst Du davon:</p>
</blockquote>
<p>Ja, auch in dem Fall schiebt VS den Code-Block leider extrem weit nach rechts...</p>
<p>mgaeckler schrieb:</p>
<blockquote>
<p>Zu Deinen Performazüberlegungen: Es sollte wurscht sein, wo Du Deine Variable deklariert, solange sie nicht konstruiert werden muß.</p>
<p>mfg Martin</p>
</blockquote>
<p>Aber muss theoretisch nicht trotzdem Platz für diese Variable reserviert werden?</p>
<p>cooky451  schrieb:</p>
<blockquote>
<p>Wenn es sich wie hier um ein int (oder sonstige fundamentale Datentypen handelt) sieht der generiert Code höchstwahrscheinlich genau gleich aus. Das VS den Kram so weit nach rechts schiebt kann ich allerdings nicht nachvollziehen, bei mir sieht das ganz normal aus:</p>
</blockquote>
<p>Also das int war nur ein Beispiel... Heißt also bei komplexeren Datentypen sollte man das nicht so machen?</p>
<p>Warum VS das macht konnte ich auch nicht herausfinden, aber ich würde auch so gerne auf die extra Klammern verzichten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2379302</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2379302</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Fri, 24 Jan 2014 11:25:24 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Variablen in switch-case und Perfromance on Fri, 24 Jan 2014 11:40:57 GMT]]></title><description><![CDATA[<p>happystudent schrieb:</p>
<blockquote>
<p>Aber muss theoretisch nicht trotzdem Platz für diese Variable reserviert werden?</p>
</blockquote>
<p>Nein, solange du nicht irgendwo die Adresse der Variablen nimmst kann der Compiler da machen was er für am besten hält. Der kann die Variable z.B. ausschließlich in ein Register legen, oder falls es sich um eine Konstante handelt ganz weg optimieren. Solche Micro-Optimierungen sind meist fällig unnötig. Das kann der Kompiler praktisch immer besser. Wenn du so etwas wirklich wissen möchtest hilft ohnehin nur selber messen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2379304</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2379304</guid><dc:creator><![CDATA[TNA]]></dc:creator><pubDate>Fri, 24 Jan 2014 11:40:57 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Variablen in switch-case und Perfromance on Fri, 24 Jan 2014 11:43:28 GMT]]></title><description><![CDATA[<p>happystudent schrieb:</p>
<blockquote>
<p>Also das int war nur ein Beispiel... Heißt also bei komplexeren Datentypen sollte man das nicht so machen?</p>
</blockquote>
<p>Kommt drauf an. Wenn der Contructor Nebenwirkungen hat, kann der Compiler da die Reihenfolge möglicherweise nicht ändern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2379305</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2379305</guid><dc:creator><![CDATA[TNA]]></dc:creator><pubDate>Fri, 24 Jan 2014 11:43:28 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Variablen in switch-case und Perfromance on Fri, 24 Jan 2014 12:09:39 GMT]]></title><description><![CDATA[<p>happystudent schrieb:</p>
<blockquote>
<p>Also das int war nur ein Beispiel... Heißt also bei komplexeren Datentypen sollte man das nicht so machen?</p>
</blockquote>
<p>Genau. Variablen so lokal wie möglich machen. Gerade bei komplexen Typen wie Dateien<sup>*</sup>.</p>
<p><sup>*</sup> Naja, std::strings in innersten Schleifen mögen auch gerne mal um eine Stufe rausgetan werden, um new/delete zu sparen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2379310</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2379310</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 24 Jan 2014 12:09:39 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Variablen in switch-case und Perfromance on Fri, 24 Jan 2014 12:37:05 GMT]]></title><description><![CDATA[<p>happystudent schrieb:</p>
<blockquote>
<p>mgaeckler schrieb:</p>
<blockquote>
<p>was hälst Du davon:</p>
</blockquote>
<p>Ja, auch in dem Fall schiebt VS den Code-Block leider extrem weit nach rechts...</p>
</blockquote>
<p>Kann man dem das nicht abgewöhnen? Er macht das ja auch glaube ich nicht dauernd, oder? Ich arbeite nicht sehr viel mir VS und habe nur wenig Probleme dieser Art.</p>
<p>happystudent schrieb:</p>
<blockquote>
<p>mgaeckler schrieb:</p>
<blockquote>
<p>Zu Deinen Performazüberlegungen: Es sollte wurscht sein, wo Du Deine Variable deklariert, solange sie nicht konstruiert werden muß.</p>
<p>mfg Martin</p>
</blockquote>
<p>Aber muss theoretisch nicht trotzdem Platz für diese Variable reserviert werden?</p>
</blockquote>
<p>Ob der Compiler beim Eintritt 10 oder 11 Variablen auf dem Stack reserviert ist völlig wurscht. Du verschwendest zwar unter Umständen 4 Byte auf dem Stack, dafür muß der Block im switch dies nicht mehr tun, was auch wieder ein paar Byte und Taktzyklen einspart. Darüber hinaus wir befinden uns im Jahre 2014. Die Zeiten, als wir die Taktzyklen einzelner CPU-Befehle summiert haben, oder jedes einzelne Byte hinterfragt haben, sind vorbei. Ich bin kein Freund von verschwenderischer Programmierung, aber das habe ich mir schon lange wieder abgewöhnt.</p>
<p>Bei meinem ersten Computer wurde die Kapazität noch in Byte gemessen. Ich mußte mir einen Centronicstreiber schreiben und der durfte nicht mehr als 128 Byte groß sein. Der Stack der CPU hatte eine maximale Größe von 256 Byte. Damals wurde jeder Taktzyklus und jedes einzelne Byte hinterfragt.</p>
<p>mfg Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2379315</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2379315</guid><dc:creator><![CDATA[mgaeckler]]></dc:creator><pubDate>Fri, 24 Jan 2014 12:37:05 GMT</pubDate></item></channel></rss>