Frage

Ich mag Unterschied zwischen statischen Variablen kennen und globalen Variablen in Bezug auf Zugriffsgeschwindigkeit und Platzverbrauch . (Wenn Sie meine Plattform wissen:... Gcc-Compiler unter Windows (ich benutze Cygwin mit Triton IDE für ARM7 Embedded-Programmierung unter Windows Triton kommt mit gcc-Compiler auf Java-Plattform, die unter Windows ausgeführt werden kann))

(Natürlich weiß ich, in Bezug auf die Datei und Funktionsumfang von diese Frage )

Edit:. OK geben Sie mir eine Antwort auf jede Mikro-Controller / Prozessor-Umgebung

War es hilfreich?

Lösung

Es gibt keinen Unterschied für den Raum, nehmen sie die gleiche Menge.

Aber es gibt eine Geschwindigkeitsdifferenz. Statisch schneller ist

Natürlich ist der Speicherzugriff auf die Variable ist für die globale und statische derselben. Aber kann der Compiler optimiert, wenn Sie statische haben. Wenn es ein Modul kompiliert weiß es, dass keine Funktion Aufruf einer Funktion außerhalb des Moduls eine statische Variable ändern. So ist es genau weiß, was passiert, und kann z.B. halten Sie es in einem Register über Funktionsaufrufe. Wenn es global ist, und Sie rufen eine Funktion aus einem anderen Modul, kann der Compiler nicht weiß, was es tut. er muß daher davon ausgehen, dass die Funktion die Variable zugreift und ändert es, in einem Laden und Neuladen führt.

Mit gcc können Sie alle .c Quellen zur gleichen Zeit passieren, so ist es dann auch sehen kann, was in der Funktion geschieht mit Funktionen aus verschiedenen Modulen aufruft. Damit es funktioniert Sie neben allen .c Dateien auf einmal -combine und -fwhole-program passieren müssen. Die -fwhole-program macht alle Globals statische (nicht Modul statisch, sondern Kompilierungseinheit statisch, das heißt alle gegebenen .c Dateien zusammen). Die -combine macht die Intermodul-Analyse.

Andere Tipps

Space Verbrauch: im Grunde keinen Unterschied. Das einzige Mal, es würde ein Raum Problem sein, wenn Sie das gleiche Stück von statischen Daten versteckt in N Objektdateien erhalten verwalten, Sie dann einen Multiplikationsfaktor von N erhalten, wo Sie nur 1 Exemplar haben könnte, wenn es sich um ein einziges globales Stück war von Dateien. Doch das ist ein Fehl Design-Problem. Information Hiding ist gut -. Es sei denn, die Informationen sollten nicht ausgeblendet werden

Zugriffsgeschwindigkeit:. Kein Unterschied

Es ist schwer zu erraten oder zu schätzen. Es wäre wahrscheinlich einige Zeit dauern, aber ich würde ein Beispielprojekt und Test für die Geschwindigkeit machen. Testen sowohl Zugriffsgeschwindigkeit und Raum mit einer Schleife. Testen Sie das Beispielprojekt mit einem Emulator für diese Architektur.

Ich würde erwarten, ein Unterschied von käme Verpackung (für Platz) und Caching (für Geschwindigkeit) Fragen. Sowohl diejenigen, auch von so gut wie alles andere auch entstehen können.

Es ist kein Unterschied in der env Sie beschreiben, wenn es darum geht, Raum . Die statische oder globale var verbrauchen nur die gleiche Menge an Speicher.

Geschwindigkeit Überlegungen (, aber nicht gut Praxis ) konnte man bevorzugen globaler Vars , wenn Sie Zugriff auf die var außerhalb der einer Datei . (Ref Verwendung von external char my_global_char_placed_else_where;)

Für eine bessere Praxis verwenden Sie get / set-Funktionen statt, aber sie sind langsamer. So könnten Sie Makros für get / set eines var zu verwenden, die global von dem Leser des Codes zu verstecken, dass der var in der Tat ist global, aber das ist kind'a wie Betrug. Aber es kann den Code besser lesbar machen.

Wenn Sie eine var in einer Funktion vergleichen versteckt, dann hat es keinen Unterschied im Vergleich mit ihm außerhalb der Funktion platzieren und mehr Funktionen könnten Zugriff auf die var haben.

Ich selbst benutze MSP430, ARM7 (nur für Tests) und AVR32 Mikros für Entwicklung

Was Jonathan sagt, ist nicht ganz richtig. Sowohl statische als auch globale Variablen sein (muss) in der ZI gespeichert (oder RW Daten) Regionen. Der Compiler kann nicht „halten“ sie über das Register streng -, was es tun könnte, ist der Wert in das Register laden, verwenden, die für alle Operationen zu registrieren und als diesen Wert speichern zurück - das ist eine Compiler-spezifische Optimierung. Und selbst dann gibt es keinen Grund, warum der Compiler wird nicht, dass auch für globale Variablen zu tun: es sei denn natürlich u es flüchtig machen. Aber dann, technisch können Sie auch eine statische Variable volatil, also wieder keinen Unterschied.

Edit:. Achja - Raum: kein Unterschied

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top