Domanda

Il compilatore ottimizza eventuali moltiplicazioni per 1? Cioè, considera:

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

L'espressione 5 * a sarà ottimizzata in soli 5? In caso contrario, lo farà se a è definito come:

const int a = 1;
È stato utile?

Soluzione

Precalcolerà eventuali espressioni costanti durante la compilazione, inclusa la concatenazione di stringhe. Senza il const rimarrà solo.

Il tuo primo esempio viene compilato in questo 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 

Il secondo esempio viene compilato in questo modo:

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

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

Altri suggerimenti

La propagazione costante è una delle ottimizzazioni più comuni e più semplici.

Guardando il codice generato dal compilatore mono, la versione con la non const a esegue la moltiplicazione in fase di esecuzione. Cioè, la moltiplicazione non è ottimizzata. Se si effettua una const, la moltiplicazione viene ottimizzata.

Il compilatore Microsoft potrebbe avere un compilatore più aggressivo, la soluzione migliore è guardare il codice generato dal compilatore per vedere cosa sta facendo.

Ciò che il compilatore dovrebbe ottimizzare qui non è la moltiplicazione per 1 di per sé, ma piuttosto l'aritmetica con valori noti in fase di compilazione. Quindi sì, un compilatore ottimizzerebbe tutti i calcoli nel tuo esempio, con o senza la const .

Modifica: un compilatore competente , dovrei dire.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top