Laden...

Variablendeklaration im Scope oder außerhalb: Macht das einen Unterschied?

Erstellt von Astrix vor 11 Jahren Letzter Beitrag vor 11 Jahren 835 Views
Thema geschlossen
A
Astrix Themenstarter:in
12 Beiträge seit 2012
vor 11 Jahren
Variablendeklaration im Scope oder außerhalb: Macht das einen Unterschied?

Hi,

ich habe eine spezielle Frage aus Interesse und weiß darum nicht so recht wonach ich suchen könnte und wie ich den Beitragstitel hätte wählen sollen.

Zunächst hier mal ein Beispielcode:

                    
                    // Beispiel A:
                    for(int i = 0; i < 1000; i++)
                    {
                        // ...tue etwas...
                        int x = tue_etwas.Result * i;
                        // ...tue etwas mit x...
                    }

                    // Beispiel B:
                    int x;
                    for (int i = 0; i < 1000; i++)
                    {
                        // ...tue etwas...
                        x = tue_etwas.Result * i;
                        // ...tue etwas mit x...
                    }

Im Beispiel A habe ich die int-Variable x im Inner-Scope der Schleife i deklariert.

Im Beispiel B habe ich die int-Variable x hingegen vor der Schleife i deklariert.

Meine Frage ist nun:

Wird im Beispiel A in C# bei jedem Schleifenschritt ein Speicherplatz zum Ablegen des Variableninhalts x auf dem Heap belegt und beim Beispiel B nicht (weil x ja wiederverwendet werden würde/könnte)?

Natürlich ist mir klar, dass so etwas unter Mico-Optimierung fällt, aber ich frage mich das schon länger und würde es gerne rein aus Interesse mal wissen
wie C# hier intern arbeitet.

Ich hoffe meine Frage war nicht allzu "dumm".

Danke für alle Antworten im voraus.

S
248 Beiträge seit 2008
vor 11 Jahren

Hallo Astrix,

Wird im Beispiel A in C# bei jedem Schleifenschritt ein Speicherplatz zum Ablegen des Variableninhalts x auf dem Heap belegt und beim Beispiel B nicht (weil x ja wiederverwendet werden würde/könnte)?

Alle in Methoden deklarierten Variablen werden auf dem Stack gespeichert. Dabei sollte es keinen Unterschied machen ob du x innerhalb oder ausserhalb deklarierst. Der Compiler sollte in beiden Fällen die 4 Bytes für die Variable reservieren, d.h. der Speicherplatz muss nicht allokiert oder wieder freigegeben werden.

wie C# hier intern arbeitet

Das ist nicht C# spezifisch. Wenn du ähnlichen Code in C/C++/Pascal ect schreibst, sollte am Ende ähnlicher Assembler Code dabei herauskommen.

In Understanding the Stack gibts eine kurze Erlärung, wie der Stack funktioniert.

Grüße

49.485 Beiträge seit 2005
vor 11 Jahren

Hallo Astrix,

wenn ich nach "variable scope" mit "Nur Betreff durchsuchen" suche, finde ich genau einen Treffer, und der enthält die Antwort auf deine Frage:

locale variable can be declared in inner scope => Erhöht das Befolgen des Rats den Ressourcenbedarf?

Es gibt aber tatsächlich Situationen, wo es einen Unterschied macht, nämlich wenn man captured variables verwendet, siehe z.B. Von einem Thread auf einen anderen zugreifen [und captured variables] (und zum genaueren Verständnis noch die zwei Beiträge davor).

herbivore

Thema geschlossen