In generale, sì. Ma non c'è garanzia, e i luoghi in cui il compilatore lo farà sono probabilmente rari.
Ciò che la maggior parte dei compilatori fa senza problemi è il sollevamento di valutazioni immutabili fuori dal ciclo, ad es. se la sua condizione è
if (a<b) ....
quando A e B non sono influenzati dal ciclo, il confronto verrà effettuato una volta prima del ciclo.
Ciò significa che se il compilatore può determinare la condizione non cambia, il test è economico e il salto previsto è previsto. Ciò a sua volta significa che il test stesso costa un ciclo o nessun ciclo (davvero).
In quali casi la suddivisione del ciclo sarebbe vantaggiosa?
a) un ciclo molto stretto dove il ciclo 1 è un costo significativo
b) l'intero anello con entrambe le parti non si adatta il codice di cache
Ora, il compilatore può solo fare ipotesi sul codice cache, e di solito può ordinare il codice in modo che un ramo si adatti alla cache.
Senza alcuna prova, I'dexpect a) l'unico caso in cui sarebbe stato applicato un tale ottimizzazione, lo stavano ristrutturando è nto sempre la scelta migliore:
In quali casi la divisione del ciclo sarebbe male?
Quando si suddivide il ciclo aumenta la dimensione del codice oltre la cache del codice, si avrà un colpo significativo. Ora, questo riguarda solo te se il ciclo stesso viene chiamato all'interno di un altro ciclo, ma questo è qualcosa che il compilatore di solito non è in grado di determinare.
[modifica]
non ho potuto ottenere VC9 per dividere il seguente ciclo (uno dei pochi casi in cui si potrebbe effettivamente essere utile)
extern volatile int vflag = 0;
int foo(int count)
{
int sum = 0;
int flag = vflag;
for(int i=0; i<count; ++i)
{
if (flag)
sum += i;
else
sum -= i;
}
return sum;
}
[EDIT 2]
si noti che con int flag = true;
il secondo ramo viene ottimizzato. (e no, const non fa la differenza qui;))
Che cosa significa? O non lo supporta, non importa, la mia analisi è sbagliata ;-)
In generale, direi che si tratta di un'ottimizzazione che è valida solo in pochissimi casi e può essere eseguita a mano facilmente nella maggior parte degli scenari.
Grazie per la risposta. Dal tuo link wikipedia ho trovato la pagina per "loop unswitching", che sembra essere un termine ancora più preciso per questo tipo di ottimizzazione. –
Sebbene i termini non siano realmente tagliati e asciugati, loop-hoisting e loop-invariant-code-motion non sono realmente usati per descrivere questa ottimizzazione. Sono più per le singole istruzioni. –
Collegamento a 'loop unswitching' a cui fa riferimento OP: https://en.wikipedia.org/wiki/Loop_unswitching – BrodieG