Tut mir leid, wenn das eine dumme Frage ist: -)
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.
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 würdest du tun?
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.
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
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).
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.
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.
Tags und Links c legacy-code