Frage

Hat der Compiler optimiert heraus alle Multiplikationen mit 1? Das heißt, berücksichtigen:

int a = 1;
int b = 5 * a;

Wird der Ausdruck 5 * a in 5 nur optimiert werden? Wenn nicht, wird es, wenn eine wie folgt definiert:

const int a = 1;
War es hilfreich?

Lösung

Es wird keine konstante Ausdrücke im Voraus berechnen, wenn es kompiliert, einschließlich String-Verkettung. Ohne die const wird es in Ruhe gelassen werden.

Ihr erstes Beispiel kompiliert diesen IL:

.maxstack 2
.locals init ([0] int32, [1] int32)

ldc.i4.1   //load 1
stloc.0    //store in 1st local variable
ldc.i4.5   //load 5
ldloc.0    //load 1st variable
mul        // 1 * 5
stloc.1    // store in 2nd local variable 

Das zweite Beispiel kompiliert diese:

.maxstack 1
.locals init ( [0] int32 )

ldc.i4.5 //load 5 
stloc.0  //store in local variable

Andere Tipps

Konstantenpropagation ist eine der häufigsten und am leichtesten Optimierungen.

an dem von dem Mono-Compiler erzeugte Code sucht, die Version mit dem nicht-const a führt die Multiplikation zur Laufzeit. Das heißt, die Multiplikation nicht optimiert werden. Wenn Sie einen const zu machen, dann wird die Multiplikation optimiert werden.

Der Microsoft-Compiler einen aggressiveren Compiler haben könnte, ist die beste Lösung auf dem Code durch den Compiler erzeugt, um zu sehen, was es tut.

Was würden die Compiler optimieren hier nicht um 1 ist die Multiplikation per se, sondern vielmehr Arithmetik mit Werten bekannt zu Kompilierung-Zeit. Also ja, ein Compiler würde optimieren Sie alle Mathematik in Ihrem Beispiel, mit oder ohne const.

Edit:. A kompetent Compiler, sollte ich sagen,

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top