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:
- Führt der Compiler diese Art von Optimierungen in Release-Builds durch ?.
- Verwendet es den Speicher von Variablen, die nicht mehr in der Funktion verwendet werden, um die Verwendung von mehr Registern zu vermeiden ?.
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
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
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