2008-11-27 14 views
5

Ich würde gerne den Unterschied zwischen statischen Variablen und globalen Variablen in Bezug auf Zugriffsgeschwindigkeit und Speicherplatz Verbrauch. (Wenn Sie meine Plattform wissen möchten: GCC-Compiler unter Windows. (Ich verwende 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.))Statisch vs global in Bezug auf Geschwindigkeit und Platzbedarf in C

(Offensichtlich weiß ich in Bezug auf Datei-und Funktionsumfang von this question)

Edit: OK gib mir eine Antwort auf jedem Mikrocontroller/Prozessor-Umgebung.

Antwort

10

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

Aber es gibt einen Geschwindigkeitsunterschied: statisch ist schneller.

Natürlich ist der Speicherzugriff auf die Variable global und statisch gleich. Aber der Compiler kann optimieren, wenn Sie statisch sind. Wenn ein Modul kompiliert wird, weiß es, dass kein Funktionsaufruf an eine Funktion außerhalb des Moduls eine statische Variable ändern kann. So weiß es genau was passiert und kann z.B. Halte es in einem Register über Funktionsaufrufe. Wenn es global ist und Sie eine Funktion von einem anderen Modul aufrufen, kann der Compiler nicht wissen, was es tut. Daher muss er davon ausgehen, dass die Funktion auf die Variable zugreift und sie ändert, was zu einem Speichern und Neuladen führt.

Mit gcc können Sie alle .c Quellen zur gleichen Zeit übergeben, so dass es dann auch sehen kann, was bei Funktionsaufrufen von Funktionen von verschiedenen Modulen geschieht. Damit es funktioniert, müssen Sie neben allen .c Dateien auf einmal -combine und -fwhole-program übergeben. Die -fwhole-program macht alle Globalen statisch (nicht Modul statisch, sondern Kompilierungseinheit statisch, d.h. alle angegebenen .c Dateien zusammen). Die -combine macht die Intermodulanalyse.

1

Platzverbrauch: im Grunde kein Unterschied. Die einzige Zeit, in der es zu einem Platzproblem kommen würde, wenn Sie den gleichen Teil statischer Daten in N Objektdateien finden, erhalten Sie einen Multiplikationsfaktor von N, in dem Sie möglicherweise nur eine Kopie haben, wenn es sich um ein einzelnes globales Stück handelt von Dateien. Das ist jedoch ein Designfehler. Das Ausblenden von Informationen ist gut - es sei denn, die Informationen sollten nicht ausgeblendet werden.

Zugriffsgeschwindigkeit: kein Unterschied.

1

Es ist schwer zu schätzen, oder zu schätzen. Es würde wahrscheinlich Zeit brauchen, aber ich würde ein Beispielprojekt machen und auf Geschwindigkeit prüfen. Testen Sie Zugriffsgeschwindigkeit und Speicherplatz mit einer Schleife. Testen Sie das Beispielprojekt mit einem Emulator für diese Architektur.

+0

Ein Blick auf die Baugruppe, die vom Compiler erstellt wurde, würde ebenfalls aufschlussreich sein. –

1

Ich würde erwarten, dass jeder Unterschied von Packen (für Platz) und Caching (für Geschwindigkeit) Probleme kommen würde. Beide könnten auch aus fast allem anderen entstehen.

0

Es gibt keinen Unterschied in der Umgebung, die Sie beschreiben, wenn es um Raum geht. Die statische oder globale Variable verbraucht nur die gleiche Menge an Speicher.

Für Geschwindigkeit Überlegungen (aber keine gute Praxis) konnte man bevorzugen globale Vars, wenn Sie Zugriff auf die var außerhalb der eine Datei benötigen. (ref Verwendung von external char my_global_char_placed_else_where;)

Für bessere Praxis verwenden Sie stattdessen Get/Set-Funktionen, aber sie sind langsamer. Also könnten Sie Makros für get/set einer var verwenden, die global ist, um vor dem Leser des Codes zu verbergen, dass die var tatsächlich global ist, aber das ist ein bisschen wie ein Betrug. Aber es kann den Code lesbarer machen.

Wenn Sie vergleichen, eine Var innerhalb einer Funktion zu verstecken, dann hat es keinen Unterschied gegenüber der Platzierung außerhalb der Funktion und mehr Funktionen könnten Zugriff auf die Var haben.

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

+0

Danke Jonathan Leffler – eaanon01

0

Was Jonathan sagt, ist nicht ganz richtig. Sowohl statische als auch globale Variablen werden (müssen) in den ZI (oder RW-Daten) -Regionen gespeichert. Der Compiler kann es nicht streng über dem Register "behalten" - was es tun könnte, ist den Wert in das Register zu laden, dieses Register für alle Operationen zu verwenden und diesen Wert zurück zu speichern - das ist eine kompilerspezifische Optimierung. Und selbst dann gibt es keinen Grund, warum der Compiler dies auch für globale Variablen nicht tut: außer natürlich, damit er volatil wird. Aber technisch kann man auch eine statische Variable volatil machen, also wieder keinen Unterschied.

Bearbeiten: oh ja - Raum: kein Unterschied.