statisch im Cache gespeichertes Ergebnis

8

Im folgenden Beispiel -

%Vor%

Die Ausgabe kommt als -

  

[21] 21

     

[22] 21

     

[23] 21

Was ist der Grund, warum result value bei nachfolgenden Aufrufen an dieselbe Funktion nicht geändert wird? Ich habe auch die Ausgabe der Variable a gedruckt, die sicherlich inkrementiert wird und da es auch statisch ist, dürfen nicht mehrere Kopien für dieselbe Methode existieren.

IDEONE - COMPILER-AUSGABE

    
Abhinav Gauniyal 22.12.2016, 04:06
quelle

4 Antworten

3

Die const stören hier nur den Leser von der wahren Ursache. Dieser Code führt genau das gleiche aus.

%Vor%

Der wahre Grund ist, dass das = -Zeichen zwei verschiedene Operationen in C ++ darstellen kann: eine Zuweisung (jedes Mal ausgeführt) oder eine Initialisierung (wird nur ausgeführt, wenn die Variable erstellt wird). Der Unterschied, wenn es Teil der Deklaration / Definition der Variablen ist.

Im normalen Kontext (nicht statische Blockvariablen) sind beide gleich, da eine automatische Variable jedes Mal erstellt wird, wenn der Block deklariert wird (oder zumindest muss der Compiler sicherstellen, dass sich alle als ob es, dass der Fall).

Aber für eine statische Blockvariable tritt die Initialisierung nur einmal auf und hier wird das variable Ergebnis auf 21 initialisiert und sein Wert wird sich niemals ändern.

Diese Varianten wären sehr verschieden

%Vor%     
Serge Ballesta 22.12.2016, 08:04
quelle
4

Da result statisch ist, wird es nur einmal zur Laufzeit initialisiert. Daher wird die folgende Zeile nur einmal ausgeführt, egal wie oft someMethod()

aufgerufen wird %Vor%     
Gaurav Sehgal 22.12.2016 04:19
quelle
1

Static ist ein Hinweis für den Compiler, eine Variable nicht neu zu initialisieren, abgesehen davon, dass der Compiler gezwungen wird, den Wert der Variablen dem Datensegment des Programms zuzuordnen.

    
Misgevolution 22.12.2016 09:28
quelle
0

Wie von anderen erläutert, ist result eine static Variable, so dass sie nur bei der ersten Ausführung von someMethod() initialisiert wird.

Und result ist auch const , also der erste Wert, der mit

zugewiesen wurde %Vor%

bleibt für die folgende Ausführung des Programms unverändert.

Ich nehme an, Sie haben etwas erwartet, das mit einer Referenz erreichbar ist; wenn Sie die vorhergehende Zeile wie folgt ändern

%Vor%

Sie verknüpfen result mit a und ändern a mit result und die Ausgabe ist

%Vor%

Das Problem besteht darin, dass Sie eine Variable auf eine andere Variable und nicht auf einen Ausdruck verweisen können. Sie können also result mit a verbinden, nicht mit a+1 (nicht mit dem dynamischen Wert von a+1 ); also die folgende Zeile

%Vor%

Kompiliere, aber (wenn ich nicht falsch liege) link result mit der unbenannten Variable wo (bei der ersten Ausführung von someMethod() ) das Ergebnis des Ausdrucks a + 1 gespeichert wird, also ist die Ausgabe wieder

%Vor%     
max66 22.12.2016 12:56
quelle

Tags und Links