2016-08-02 16 views
2

Ich habe tatsächlich einige Ergebnisse gesehen, indem ich es getestet habe, aber ich möchte wissen, welcher Weg besser ist und warum.Beeinflusst dies nicht die Effizienz, um eine Funktionsvariable als lokal statt global zu deklarieren?

Frage # 1: Werden lokale Variablen jedes Mal deklariert, wenn ich diese Funktion immer wieder anrufe? Ich weiß, dass es besser ist, Variablen im engsten möglichen Umfang zu deklarieren. Aber ich kann nicht aufhören, darüber nachzudenken, es als globale Variable zu deklarieren und es nur einmal deklarieren zu lassen, nicht in jedem Funktionsaufruf. Oder wird es bei jedem Funktionsaufruf erneut deklariert? Ich weiß, dass der Gültigkeitsbereich einer lokalen Variablen nur diese Funktion ist. Also, wenn es diese Funktion verlässt, muss es diese Variable vergessen, da sie außerhalb ihres Gültigkeitsbereichs liegt, richtig?

Frage # 2: Wenn ich einige Funktionsvariablen habe, die ihren vorherigen Inhalt speichern müssen (zB Timer-Zählervariablen), ist es besser: sie als globale Variable zu deklarieren oder als statisches Local zu deklarieren Variable? Ich brauche sie nicht, um ihre Anfangswerte zu erhalten, wenn ich diese Funktion anrufe, ich setze sie bereits auf Null oder so, wann immer ich es brauche.

+0

** Frage1 **: Was ist das Problem, wenn Platz für Variable Stapel zugewiesen sind jedes Mal, wenn Sie die Funktion aufrufen? ** Frage2 **: Wenn diese Variablen nur im Funktionsumfang verwendet werden, würde ich sie innerhalb des Funktionsumfangs als statisch deklarieren. – LPs

+0

Zeigen Sie Code und Testergebnisse dafür an und erklären Sie, wie Sie sie erhalten haben. Sonst schießt es im Dunkeln. –

+0

Ich meinte, ich habe gesehen, dass beide Wege gut funktionieren und sich als global oder statisch lokal deklarieren. Aber ich wollte wissen, welches besser ist. Wenn Sie ein Testergebnis in Bezug auf die Geschwindigkeit usw. meinten, weiß ich nicht, wie oder wo das zu tun ist. –

Antwort

5

Frage 1: lokale Do Variablen werden jedes Mal deklariert, wenn ich diese Funktion immer wieder anrufe?

A1: Ja, aber es ist nicht wirklich Thema.

Wenn eine lokale Variable deklariert wird, wird für diese Variable auf dem Stapel innerhalb des Stapelrahmens dieser Funktion Platz geschaffen. Das Deklarieren einer globalen Variablen bedeutet, dass für diese Variable im Datenabschnitt der ausführbaren Datei (wenn die Variable initialisiert wird) oder im BSS-Abschnitt (falls nicht) ein Leerzeichen erstellt wird.

Die Zuweisung auf dem Stapel erfolgt ohne Kosten. Bei der Funktionseingabe wird der Stack-Frame so dimensioniert, dass Platz für alle lokalen Variablen der Funktion geschaffen wird. Ein mehr oder weniger ist egal. Statische Zuweisung (für eine globale Variable) ist ein bisschen schneller, aber Sie erhalten nur diese eine Variable. Dies kann zu einem großen Problem zu einem späteren Zeitpunkt werden, z. Wenn Sie Ihr Programm multithread-fähig machen wollen, ist Ihre Funktion reentrant oder Ihr Algorithmus rekursiv. Es kann auch zu einem großen Ärger während des Debuggens werden und Stunden unproduktiver Zeit verschwenden, während Sie diesen Bug jagen.

(Dies ist der wichtigste Punkt des Ganzen:.. Der Performance-Unterschied ist wirklich vernachlässigbar Die Zeit, die Sie auf einem suboptimalen Design mit Globals gespickt, auf der anderen Seite verschwenden, können ganz erheblich sein)

Frage # 2: [...] welcher Weg ist besser: sie als globale Variable zu deklarieren oder sie als statische lokale Variable zu deklarieren?

A2: Aus architektonischer Sicht vermeiden Globals wo immer möglich. Es gibt ein paar spezielle Fälle, in denen sie sinnvoll sind, aber Sie kennen sie, wenn Sie sie sehen. Wenn Sie es ohne Globals funktionieren lassen können, vermeiden Sie sie. (Dies gilt auch für statische Einheimische. Sie sind besser als globale, da sie im Umfang begrenzt sind, und es gibt Fälle, in denen sie sinnvoll sind, aber lokale Variablen sollten wirklich der "Standard" sein.)

+0

Sehr gute Antwort. Und Upvote zur Warnung vor statischen Einheimischen. In der Tat können Funktionen mit statischen Locals nicht Unit-getestet werden. – dlask

+0

@dlask Sie können in der Einheit getestet werden, aber Sie müssen darauf achten, ihren Zustand richtig einzustellen. – CodeMonkey

+0

@ user3387223 Wie können Sie Werte von statischen Locals außerhalb der Funktion festlegen? Bitte beachten Sie, dass die Funktion oft aufgerufen werden kann, wenn Komponententests ausgeführt werden. – dlask

1

Global Variable - zu Beginn des Programms erklärt, ihre globale Reichweite bedeutet, dass sie in jedem Verfahren oder Unterprogramm in das

Programm verwendet werden

Es ist selten ratsam globale Variablen zu verwenden da sie Bugs verursachen können, Speicher verschwenden und beim Verfolgen von Code schwer zu folgen sind. Wenn Sie eine globale Variable deklarieren, wird weiterhin Speicher verwendet, während ein Programm läuft, auch wenn Sie es nicht mehr benötigen/benutzen.

Lokale Variable - deklariert innerhalb von Unterprogrammen oder Programmierbausteine, ihre lokalen Bereich bedeutet, dass sie nur innerhalb des Unterprogramm oder Programmblock verwendet werden, sie in

Lokale Variablen deklariert wurden, sind innerhalb eines eingeleitet begrenzter Gültigkeitsbereich, dh sie werden deklariert, wenn eine Funktion oder ein Unterprogramm aufgerufen wird, und sobald die Funktion endet, wird der von der Variablen belegte Speicher freigegeben. Dies steht im Gegensatz zu globalen Variablen, die keinen Speicher freigeben.


Frage # 1:YES. Lokale Variablen werden jedes Mal deklariert, wenn Sie diese Funktion immer wieder aufrufen. Nachdem es die Funktion verlassen hat, vergibt es die Variablen, die Sie in diesem Bereich deklariert haben. Sie müssen auch daran denken, dass das Programm beginnt, nach einer Variablen zu suchen. Wenn es also näher ist, im selben Umfang zu deklarieren, wird es schneller finden und fortfahren können. Auch wird dies mehr efficent sein, während Sie Codierung und verursacht weniger Fehler und Irrtümer usw.

Frage # 2: Wenn Sie die gleiche Variable mit unterschiedlichen Funktionen zu verwenden, empfehle ich Ihnen, sie zu erklären als globale oder define, dies wird dazu führen, dass das Programm Ihren "Zähler" mit sich führt. So kann es schnell verwendet werden, wenn Sie zwischen den Bereichen benötigen, die Sie reisen. Aber nach diesen Bedingungen muss ich vorschlagen, dass Sie stark an:

vermeiden Globals wo immer möglich (wie @DevSolar sagte)

+0

Hi ** @ DevSolar **, bist du sicher mit deinem Argument: "* vermeide globals wo möglich. *". Ich frage, weil Sie eindeutig mehr Wissen als ich haben, aber ich kann nicht wirklich einen Code ohne globale Variablen wie ein "** counter **" oder "** max/min **" denken. Eigentlich, wenn ich meinen Code mit allen kleinen Funktionen schreibe, kann Ihr Ding ziemlich anpassungsfähig sein. ** Also meine Frage: ** Sollten wir unseren Code mit der Idee von zu vielen kleinen Funktionen schreiben, oder sollen wir sie verwenden, wenn wir brauchen? Wie wirkt sich dieser Prozess auf die Effizienz aus? Vielen Dank. –

+0

Ich bin mir nicht sicher, was Sie hier fragen. Aber im Allgemeinen sollten Sie sich über sauberes Design mehr Sorgen machen als über "Leistung". Das bedeutet nicht, dass Sie vorsätzlich schlecht aussehende Designs wählen sollten, nur dass Sie Ihr Design nicht um das, was Sie als "schneller" betrachten, drehen sollten. Schreiben Sie sauberen, wartbaren Code (Globals vermeiden, Ihren Code richtig modularisieren, Komponententests und Dokumentation schreiben), und wenn Sie erst einmal * gearbeitet * haben, können Sie Ihren Code * profilieren * und dort optimieren, wo es wirklich wichtig ist (wo normalerweise nicht du dachtest es würde). – DevSolar

+1

Beachten Sie, dass ich hier über globale * Variablen * spreche. Sie unterscheiden sich von globalen * Konstanten * (wie 'MAX_COUNT' oder solche Sachen). Das ist in Ordnung und ermutigt (über "magische Zahlen" genau dort im Code). Außerdem meinte ich wirklich * "wo immer es möglich ist". An Stellen, an denen Sie * wirklich * eine globale Variable benötigen, verwenden Sie sie. Kommentieren Sie, dokumentieren Sie, seien Sie sich ihrer möglichen Probleme bewusst, aber quetschen Sie Ihr Design nicht. Wartbarkeit übertrumpft normalerweise andere Dinge auf lange Sicht, und wenn ein globaler Code * Ihren Code * einfacher zu verwalten macht, sei es so. – DevSolar

1

Q2:

Es ist normalerweise vorzuziehen, statische Variablen in Ihrer Funktion zu verwenden. Der Hauptgrund ist, dass es sehr schwer ist, das Programm zu verfolgen und zu debuggen, da alle Funktionen auf globale Variablen zugreifen können.

Q1:

Ja, lokale Variablen jedes Mal die Funktion gehört geschaffen ausgeführt wird, und gelöscht, wenn die Enden.

Angenommen, Ihr Programm hat 5 Funktionen (die selten verwendet werden) und jede Funktion verwendet 6 lokale Variablen.Wenn Sie alle in globale Variablen ändern, benötigen Sie alle 30 Variablen für die gesamte Dauer Ihres Programms, anstatt nur 5 Variablen zu erstellen und zu vernichten. Außerdem benötigt die Zuweisung nicht wirklich viel Zeit.