Wo ist es besser, den Initialisierungscode vor oder in die Schleife zu setzen?

8

Tut mir leid, wenn das eine dumme Frage ist: -)

Hintergrund

Ich habe Legacy-Code, der so aussieht:

%Vor%

Jede Iteration der while-Schleife benötigt, dass myStruct zu etwas initialisiert wird, sagen wir Null. initializationFunction initialisiert alle Felder von myStruct auf Null.

Die Frage

Ist es gut, initializationFunction innerhalb der while-Schleife zu behalten, oder ist es besser, es vor der Schleife einmal aufzurufen, und die Programmierer initialisieren, was sie "von Hand" benötigen, wenn sie diesen Code ändern.

edit: Leider ist myStruct eine globale Variable, daher ist es keine Option, sie zu einer automatischen Variable zu machen, es sei denn, ich möchte sie als Parameter an viele Legacy-Funktionen übergeben, die sie benutzen.

Was ich denke

  • nur Aufruf von initializationFunction () wird Bugs verhindern, falls jemand den Code ändert und vergisst, myStruct zu initialisieren.
  • Es könnte informativer sein zu sehen, welche spezifischen Felder initialisiert werden.
  • Wenn nur wenige Felder später in der while-Schleife geändert werden, ist der Aufruf von initialzationFunction (), die alle Felder enthält, redundant.

Was würdest du tun?

    
Jacob G 11.09.2012, 10:07
quelle

5 Antworten

5

Da die Strukturfelder innerhalb der while-Schleife geändert werden, ist es sinnvoll, sie während jeder Iteration zu initialisieren, unabhängig vom Zweck der Verarbeitung in der Schleife.

Ich würde sagen, es ist in Ordnung, einige Felder neu zu initialisieren, auch wenn es in der Schleife nicht modifiziert wurde. Aber behalten im Auge behalten, welche Felder geändert wurden und diese Felder ausschließen Beim Initialisieren des Duings wäre die nächste Iteration ein Aufwand, auf den Sie verzichten können.

Eine Alternative wäre, eine temporäre Strukturvariable mit den Initialisierungswerten zu verwenden und sie einfach zu Beginn jeder Iteration zuzuweisen.

    
P.P. 11.09.2012, 10:26
quelle
6

Wenn Sie den Code für andere Benutzer beibehalten und der Code kein bewährter Hotspot ist, initialisieren Sie ihn jedes Mal, da weniger Fehler von anderen eingeführt werden.

Wenn der Code ein kritischer Hotspot ist, initialisieren Sie ihn einmal und lassen Sie den Code anschließend aufräumen.

Vorzeitige Optimierung ist die Wurzel allen Übels

    
Stephen Connolly 11.09.2012 10:18
quelle
1

Nun, im Idealfall würden Sie die minimale Anzahl von Operationen ausführen wollen, die das Problem lösen, das Sie angehen. Nach dieser Logik wäre es besser, die initializationFunction aus der Schleife herauszulassen und nur die Felder zu aktualisieren, die Sie für eine Schleifeniteration benötigen.

Wenn der Algorithmus in Ihrer Schleife aus Sicht der Wartung bricht (oder sich merkwürdig verhält), wenn jemand vergisst, ein Mitglied von Ihrem struct -Objekt zurückzusetzen, dann wäre es besser, alles bei jeder Schleife zu initialisieren. Dies beseitigt jedoch nicht die Möglichkeit zukünftiger Fehler, es macht es nur weniger wahrscheinlich. Am Ende hängt alles vom Kompetenzniveau des Betreuers ab.

Vom Standpunkt der Leistung ist dies ein Mikrooptimierung , und es ist nicht wirklich wichtig (es sei denn, Sie machen etwas Zeit in der Initialisierungsfunktion).

    
Alexandru C. 11.09.2012 10:29
quelle
1

Es ist eine Frage von Balance und Komplexität. Wenn auf die meisten Mitglieder in der Struktur niemals in der while-Schleife zugegriffen wird, ist die Initialisierung offensichtlich überflüssig ... ABER DANN, warum sitzen sie dann gruppiert in einer Struktur? Was war ihr ursprünglicher Zweck? In diesem Fall ist der Code an sich komplexer als notwendig, obwohl Leerlaufdaten in C natürlich weniger verwirrend sind als nie ausgeführter Code.

Wenn OTOH der Hauptteil von Strukturelementen in der while-Schleife verwendet wird, tut das Hinzufügen einer einfachen Nullzuweisung von jedem nicht sehr weh, weil jede nachfolgende Operation auf diesem Element den Leistungseinbruch der Initialisierung mehr oder weniger abschwächen wird eine 1 / n Art und Weise.

Was ich für die Codepflege als nachteilig empfinde, ist, dass die init-Funktion selbst die Struktur kennen muss, was bedeutet, dass Sie Informationen an mehr Stellen verteilen als nötig. IIRC C erlaubt Strukturen, die durch memset (die Struktur als Vektor des unsigned char berühren) nulled werden und die Mitglieder werden wirklich herauskommen 0 == & gt; Wenn das eklatant falsch ist, tut es mir sehr leid, und jemand kann mir eine gedruckte Version aller Standards über den Kopf jagen.

    
slartibartfast 11.09.2012 10:52
quelle
1

Wenn die Struktur muss bei jedem Durchlauf der Schleife initialisiert werden, dann ist es in Ordnung, es zu tun. Sie können auch eine Dummy-Struktur verwenden, die Sie vor der Schleife initialisieren, und memcpy verwenden, um in die gelöschte Struktur in die echte innerhalb der Schleife zu kopieren.

Oder wie in der akzeptierten Antwort auf die Frage, die mit Steve Jessop verknüpft ist, anstatt memcpy zu verwenden, benutzen Sie einfach die normale Zuweisung und lassen Sie den Compiler sich Sorgen um das Kopieren machen.

    
Some programmer dude 11.09.2012 10:24
quelle

Tags und Links