Optimale Deklaration von Variablen in Bezug auf den Umfang

8

Ich stelle diese Frage hauptsächlich in Bezug auf C-Programmierung, aber Einblicke in jede Sprache sind willkommen.

Wenn es um C geht, weiß ich, dass Variablen nur am Anfang eines Codeblocks vorkommen können. Und ich hatte den Eindruck, dass man alle Variablen, die innerhalb einer Funktion verwendet werden sollen, ganz zu Beginn der Funktion deklarieren sollte. Aber es gibt viele Gelegenheiten, wo ich eine Variable habe, die nur innerhalb einer Schleife (oder eines ähnlichen Blocks) verwendet wird.

Ein Beispiel wäre eine temporäre Variable für einen Rückgabewert:

%Vor%

oder wo ein Zustand gehalten werden muss:

%Vor%

Ich habe mich gefragt, ob dies als unangemessen betrachtet wird oder ob es negative Auswirkungen auf die Deklaration von Variablen innerhalb von Kontrollflussblöcken wie if-else, for-Schleifen, while-Schleifen usw. gibt.

Sollen Variablen immer mit dem größtmöglichen Umfang deklariert werden? Was ist mit statischer Deklaration?

Bearbeiten : Okay, ich hätte wahrscheinlich sagen sollen, dass ich weiß, dass C99 liberaler ist, wenn es darum geht, Variablen zu deklarieren, aber von einer Menge C-Code, den ich sehe, werden sie immer noch oben deklariert. Außerdem verwende ich VS2K8, die immer noch über Deklarationen klagt.

Da ich zwei Stimmen hatte, um dieses Thead zu schließen, werde ich klarstellen, dass ich mich mehr mit der Performance und dem Compileraspekt beschäftige als mit allem Stilistischen.

    
jay.lee 02.11.2010, 05:55
quelle

3 Antworten

5

Eine Faustregel besagt, dass Variablen immer so lokal wie möglich gemacht werden sollten. Bonuspunkte, wenn Sie const machen können.

    
Paul 02.11.2010 06:01
quelle
5

Ok, die Deklarationen an der Spitze der Blöcke sind C89 und K & amp; R, aber seit C99 können Sie Deklarationen und Anweisungen mischen. Der Stil bleibt bestehen, wahrscheinlich aus guten Gründen, aber es ist nicht erforderlich.

Es gab eine Zeit, in der einige Compiler bessere Arbeit leisteten, wenn Sie viele lokale Variablen genau dort deklarierten, wo sie verwendet wurden, weil dadurch die Registerzuweisung verbessert wurde. Vor C99 mussten Sie sie an der Spitze der Blöcke deklarieren oder eine Vendor-Erweiterung verwenden, aber Sie könnten trotzdem entscheiden, jede Variable nur in einem lokalen Codebereich zu verwenden.

Es schien an einem Punkt wichtig zu sein, dies direkt mit einer flexibleren Deklarationsplazierung zu unterstützen, aber ich vermute, dass die Optimierer heutzutage diese Art von Hilfe nicht brauchen.

Einige Kodierungsstandards erfordern Deklarationen oben in den Funktionen. Ich weiß nicht, ob das so ist, du kannst sie finden, oder wenn es nur von den Tagen übrig bleibt, wo das nicht die Rückwärtsportabilität einschränkt.

Im Allgemeinen gilt, je formaler der Standard ist, desto weniger interleavierende Anweisungen und Deklarationen, mit Ausnahme von Schleifensteuervariablen. Persönlich sehe ich das Problem damit nicht.

Vorteile gemischter Deklarationen : Lokalität. Gut für den Compiler, gut für den Leser. Welchen möglichen Nutzen kann die Deklaration einer Schleifenvariablen am Anfang einer Funktion haben? Eine Variable auf der Seite zu einem anderen Zweck wiederzuverwenden, erscheint im Hinblick auf mögliche unerwünschte Wechselwirkungen verwirrend und unklug.

Vorteile von gruppierten Deklarationen : Der Code sieht auf subjektiver Weise sauberer aus, Sie wissen, wohin Sie gehen müssen, um jede Deklaration zu finden, und ob der obere Teil Ihrer Funktion zu weit von der Verwendung der Variable, vielleicht sagt Ihnen das, dass Sie eine zweite oder dritte Funktion aus dem offensichtlich zu großen herausziehen müssen.

    
DigitalRoss 02.11.2010 06:03
quelle
2

Wenn Sie eine Variable deklarieren, wirkt sich dies nicht auf die Codegenerierung aus. Alle a Funktionsvariablen werden auf den Stack gelegt, bevor die erste Codezeile ausgeführt wird (zumindest ist dies das beobachtete Verhalten). Wie Sie bereits wissen, sind die Regeln zur Variablendeklaration lange tot. Das Deklarieren von Variablen an der Spitze hat diese Vorteile

  • einfacher zu lesen, wenn alle Variablen an derselben Stelle gefunden werden können
  • Sie müssen sich keine Sorgen darüber machen, den Code umzuordnen, wenn Sie plötzlich auf eine Variable zugreifen müssen, bevor sie deklariert wird (es sei denn, Sie möchten das absichtlich verhindern).

Und ja, ich würde Variablen so lokal wie möglich machen. Wenn eine Variable nur innerhalb einer Schleife oder eines Kontrollflusses verwendet wird oder sogar ein bedeutungsloses {} Paar (welches ich verwendet habe, um Namenskonflikte zu verhindern), dann deklariere sie dort. Nimm die berühmte Variable n oder i in for loops. Wenn Sie mehrere haben, benötigen Sie für jede for-Schleife einen eindeutigen var-Namen, der ärgerlich werden würde.

    
Alexander Rafferty 02.11.2010 06:20
quelle

Tags und Links