Question

Le compilateur optimise-t-il les multiplications de 1? C'est-à-dire, considérez:

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

L’expression 5 * a sera-t-elle optimisée à seulement 5? Si ce n'est pas le cas, est-ce que a est défini comme suit:

const int a = 1;
Était-ce utile?

La solution

Il calculera au préalable toutes les expressions constantes lors de la compilation, y compris la concaténation de chaînes. Sans const , il sera laissé seul.

Votre premier exemple compile sur cet 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 

Le deuxième exemple est compilé comme suit:

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

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

Autres conseils

La propagation constante est l’une des optimisations les plus courantes et les plus faciles.

En regardant le code généré par le compilateur mono, la version avec le non-const a effectue la multiplication au moment de l'exécution. C'est-à-dire que la multiplication n'est pas optimisée. Si vous faites un const, alors la multiplication est optimisée.

Le compilateur Microsoft pourrait avoir un compilateur plus agressif, la meilleure solution consiste à consulter le code généré par le compilateur pour voir ce qu'il fait.

Ce que le compilateur optimiserait ici, ce n’est pas une multiplication par 1, mais plutôt une arithmétique avec des valeurs connues au moment de la compilation. Alors oui, un compilateur optimiserait tous les calculs de votre exemple, avec ou sans const .

Modifier: Un compilateur compétent , devrais-je dire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top