consideri un ciclo while in ANSI C il cui unico scopo è quello di ritardare l'esecuzione:Un compilatore ANSI C può rimuovere un ciclo di ritardo?
unsigned long counter = DELAY_COUNT;
while(counter--);
Ho visto questo usato molto per far rispettare i ritardi nei sistemi embedded, in cui ad es. non esiste la funzione sleep
e i timer o gli interrupt sono limitati.
La mia lettura dello standard ANSI C è che questo può essere completamente rimosso da un compilatore conforme. Ha nessuno degli effetti collaterali descritti in 5.1.2.3:
accesso a un oggetto volatile, modifica di un oggetto, modificando un file, o chiamando una funzione che fa una di queste operazioni sono effetti indesiderati, che sono cambiamenti nello stato dell'ambiente di esecuzione.
... e questa sezione dice anche:
Un'implementazione effettiva non deve valutare parte di un'espressione se può dedurre che il suo valore non viene utilizzato e che effetti collaterali necessari vengono prodotti (compresi quelli causati chiamando una funzione o accedendo a un oggetto volatile).
Ciò implica che il ciclo potrebbe essere ottimizzato? Anche se counter
erano volatile
?
Note:
- Che questa non è proprio la stessa Are compilers allowed to eliminate infinite loops?, perché si riferisce a infiniti loop, e domande sorgono circa quando un programma è permesso di interrompere a tutti. In questo caso, il programma procederà sicuramente oltre questa linea ad un certo punto, l'ottimizzazione o meno.
- So cosa fa GCC (rimuove il ciclo per
-O1
o superiore, a meno checounter
siavolatile
), ma voglio sapere che cosa dettano gli standard.
Fintanto che il * comportamento * invisibile non viene modificato, lo standard C non proibirebbe l'ottimizzazione di questo ciclo. Quindi lo standard non impone nulla in particolare. –