2016-06-30 9 views
1

Wenn ich die meiste Zeit eine Funktion mache, mache ich eine Menge Variablen darin, nur weil es einfacher ist, den Code zu debuggen.Compiler-Optimierung - Variable Speicherauslastung

Lets sagen, ich habe diese Funktion:

void foo(int value) { 
    int x = value * 1; 
    int y = value * 2; 
    int z = value * 3; 

    int u = x + 1; 
    int v = y + 2; 
    int w = z + 3; 
} 

Dieser Code ist in Ordnung, und seine leicht zu debuggen (Sie Schritt für Schritt sehen, was geschieht), aber seine viel Speicher verwendet (28 Bytes bedenkt, dass jeder int ist 4 Bytes), und es könnte auf diese Weise optimiert werden:

void foo(int value) { 
    int u = value * 1 + 1; 
    int v = value * 2 + 2; 
    int w = value * 3 + 3; 
} 

auf dieser Grundlage habe ich einige Fragen:

  1. Führt der Compiler diese Art von Optimierungen in Release-Builds durch ?.
  2. Verwendet es den Speicher von Variablen, die nicht mehr in der Funktion verwendet werden, um die Verwendung von mehr Registern zu vermeiden ?.
+1

Ein reales Beispiel kann besser sein. Da diese Funktionen nicht ops sind und vielleicht komplett weg optimiert werden. Sie können die generierte Assembly nicht immer überprüfen, um zu sehen, dass der Compiler das tatsächlich tut, nachdem er den Code kompiliert hat. – NathanOliver

+1

Sobald die Funktion zurückkehrt, werden diese 28 Bytes für den nächsten Funktionsaufruf freigegeben. Sie werden nur vorübergehend auf dem Stapel gespeichert (was auch ziemlich billig ist). – Steve

+1

Wahrscheinlich wird keiner von ihnen existieren, da die Ausführung der Funktion nicht von ihrer Existenz abhängt. Auch die Zuweisung von Registern ist eine Sache. Die meisten lokalen Variablen sind nicht im Speicher. – harold

Antwort

3

Ja. Ein moderner Compiler wird diese Zwischenvariablen entfernen. Ja. Ein moderner Compiler wird Konstanten falten und Register und Speicherplätze wiederverwenden.

Kurz gesagt; Mach dir keine Sorgen über Sachen auf dieser Ebene, der Compiler wird es reparieren. Stattdessen sorgen Sie sich über das Schreiben von lesbarem Code und algorithmischen Verbesserungen und lassen Sie die Details dem Compiler - es ist heutzutage ziemlich schlau;)