In quali circostanze può un compilatore cambiare l'ordine di esecuzione delle istruzioni di programma?

StackOverflow https://stackoverflow.com/questions/866840

  •  22-08-2019
  •  | 
  •  

Domanda

Se questo è non una vera e propria domanda quindi sentitevi liberi di chiudere;)

È stato utile?

Soluzione

Il compilatore può cambiare l'ordine di esecuzione delle istruzioni quando lo ritiene opportuno a scopo di ottimizzazione, e quando tali modifiche non avrebbero alterare il comportamento osservabile del codice.

Un esempio molto semplice -

int func (int value)
{
    int result = value*2;
    if (value > 10)
    {
       return result;
    }
    else
    {
       return 0;
    }
}

Un compilatore naive può generare codice per questa esattamente nella sequenza indicata. In primo luogo il calcolo "risultato" e tornare solo se il valore originale è maggiore di 10 (se non lo è, "risultato" sarebbe stato ignorato - calcolato inutilmente).

Un compilatore sano, però, vedrebbe che il calcolo del "risultato" è necessaria solo quando "valore" è maggiore di 10, quindi può spostare facilmente il "valore * 2" calcolo all'interno delle prime bretelle e farlo solo se "value" è in realtà più grande di 10 (inutile citare, il compilatore non davvero guardare il codice C, quando l'ottimizzazione - funziona in livelli più bassi).

Questo è solo un semplice esempio. Molto possono essere creati esempi più complessi. E 'molto possibile che una funzione C finirebbe per guardare quasi niente come la sua rappresentazione C in forma compilata, con le ottimizzazioni abbastanza aggressivi.

Altri suggerimenti

Non solo il compilatore può riordinare esecuzione (per lo più per l'ottimizzazione), la maggior parte dei processori moderni lo fanno, anche. Per saperne di più l'esecuzione riordino e barriere di memoria .

Molti compilatori usano qualcosa chiamato "l'eliminazione sottoespressione comune". Ad esempio, se si ha il seguente codice:

for(int i=0; i<100; i++) {
    x += y * i * 15;
}

il compilatore avrebbe notato che y * 15 è invariante (il suo valore non cambia). Quindi sarebbe calcolare y * 15, attaccare il risultato in un registro e modificare l'istruzione loop per "x + = R0 * i". Questa è una specie di esempio forzato, ma si vedono spesso espressioni come questo quando si lavora con gli indici di array o qualsiasi altra base + offset di tipo di situazione.

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