Wie wird die bedingte Initialisierung gehandhabt und ist es eine gute Vorgehensweise?

8

Ich versuche zwischen mehreren möglichen Praktiken zu entscheiden. Sagen wir, meine Funktion hat eine Anzahl von if () - Blöcken, die an Daten arbeiten, die für sie einzigartig sind.

  • Soll ich die lokalen (für den Block) Daten innerhalb des Blocks deklarieren und initialisieren? Hat dies Laufzeitkosten (aufgrund der Laufzeitzuordnung im Stack)?

  • Oder sollte ich alle Variablen bei Funktionseingabe deklarieren und / oder initialisieren, so dass dies in einem, möglicherweise schnelleren, Operationsblock geschieht?

  • Oder sollte ich die if () Blöcke in verschiedenen Funktionen trennen, obwohl sie nur ein paar Zeilen lang sind und nur eine im Programm verwenden?

Oder bespreche ich eine andere, sauberere Option? Ist die Frage in ihrer gegenwärtigen, allgemeinen Form überhaupt beantwortbar?

    
Vorac 19.04.2013, 10:36
quelle

5 Antworten

8
  

Soll ich die lokalen (für den Block) Daten innerhalb des Blocks deklarieren und initialisieren?

Absolut: Dadurch werden Programme besser lesbar.

  

Hat dies Laufzeitkosten (aufgrund der Laufzeitzuordnung im Stack)?

Nein: Alle Zuordnungen erfolgen im Voraus - der Platz auf dem Stapel ist bei der Eingabe einer Funktion für Variablen in allen Zweigen reserviert, nicht bei der Eingabe der Verzweigung. Darüber hinaus können Sie dadurch Platz einsparen, da der Platz für Variablen in nicht überlappenden Zweigen vom Compiler wiederverwendet werden kann.

  

Oder sollte ich alle Variablen bei der Funktionseingabe deklarieren und / oder initialisieren, so dass dies in einem, möglicherweise schnelleren, Operationsblock geschieht?

Nein, das ist nicht schneller und könnte etwas verschwenderischer sein.

  

Oder sollte ich die if () Blöcke in verschiedenen Funktionen trennen, obwohl sie nur ein paar Zeilen lang sind und nur eine im Programm verwenden?

Das würde sich wahrscheinlich negativ auf die Lesbarkeit Ihres Programms auswirken.

    
dasblinkenlight 19.04.2013, 10:41
quelle
4

Es empfiehlt sich, den Geltungsbereich der Variablen so klein wie möglich zu halten.
Wenn Sie alle Variablen einmal am Anfang deklarieren und Sie nicht
verwenden Sie oft in Ihrem Programm. Es nützt nichts, es braucht mehr Speicher.

Ein weiterer Vorteil, den Umfang klein zu halten, ist, dass Sie
wiederverwenden können die gleichen Namen noch einmal. (Sie müssen nicht jedes Mal neue Namen erfinden.) mach etwas Triviales).

    
mohit 19.04.2013 10:46
quelle
0

Von den Optionen, die Sie angeben, deklarieren und initialisieren Sie die lokalen (für den Block) Daten innerhalb des Blocks, was Ihrem Zweck dient. Vergiss den Rest der Dinge.

    
Nandakumar Karanam 19.04.2013 10:44
quelle
0

Der Vollständigkeit halber; Eine andere, normalerweise weniger wichtige Überlegung ist Stack Padding Control / Packing, was intuitiv schwieriger ist, wenn Sie nicht alles im Voraus deklarieren.

Siehe dies für weitere Informationen, aber lassen Sie mich den folgenden Absatz betonen, bevor jemand etwas Verrücktes tut:

  

Für die kleine Anzahl skalarer Variablen in Ihren C-Programmen   bumming out die wenigen Bytes, die Sie erhalten können, indem Sie die Reihenfolge ändern   Erklärung wird Sie nicht genug speichern, um signifikant zu sein. Die Technik   wird interessanter bei der Anwendung auf nicht skalare Variablen -   besonders Strukturen.

    
tne 23.02.2014 16:10
quelle
0

Jetzt die Antwort bezüglich der Leistung.

  

Soll ich die lokalen (für den Block) Daten innerhalb des Blocks deklarieren und initialisieren? Hat dies Laufzeitkosten (aufgrund der Laufzeitzuordnung im Stack)?

Die Zuweisung lokaler Variablen ist praktisch frei. In den meisten Fällen wird es wirklich frei sein, da die Aktualisierung des Stapelzeigers in derselben Anweisung erfolgt, die den Wert in den Stapel schreibt. Die Freigabe ist entweder frei (wenn etwas vom Stapel entnommen wird) oder einmal bei der Rückkehr (wenn ein Stapelrahmen erstellt wurde).

  

Oder sollte ich alle Variablen bei der Funktionseingabe deklarieren und / oder initialisieren, so dass dies in einem, möglicherweise schnelleren, Operationsblock geschieht?

Während die Zuweisung praktisch frei ist, ist das nicht mit laufenden Konstruktoren / Destruktoren möglich. Obwohl dies nicht für Variablen primitiver Typen gilt, gilt dies für praktisch alle benutzerdefinierten Typen, einschließlich Smartpointern und ähnlichem. Wenn Sie einen intelligenten Zeiger am Anfang der Funktion deklarieren, aber nur die Hälfte der Zeit verwenden, konstruieren Sie und anschließend den intelligenten Zeiger doppelt so oft wie nötig.

Wenn Sie eine Variable deklarieren, in der Sie die Informationen haben, um sie auf Ihre Bedürfnisse zu initialisieren, können Sie sie auch direkt in den gewünschten Zustand umwandeln, anstatt sie zuerst zu konstruieren, nur um dann ihren Wert zu ändern Zuweisungsoperator in vielen Fällen). Aus Performance-Sicht sollten Sie also Variablen immer zu spät und nur in den Blöcken deklarieren, die sie brauchen.

  

Oder sollte ich die if () Blöcke in verschiedenen Funktionen trennen, obwohl sie nur ein paar Zeilen lang sind und nur eine im Programm verwenden?

Nein, das ist aus Performanceperspektive völlig kontraproduktiv. Jeder Funktionsaufruf hat einen Overhead, ich denke, es ist die meiste Zeit zwischen 10 und 20 Zyklen. Sie können in dieser Zeit ziemlich viel rechnen.

    
cmaster 23.02.2014 16:34
quelle

Tags und Links