2014-06-19 13 views
8

Come discusso in this question, C++ 11 ottimizza i loop infiniti.Previene la rimozione di loop infiniti da C++ 11

Tuttavia, nei dispositivi incorporati che hanno un unico scopo, i loop infiniti hanno senso e sono in realtà abbastanza spesso utilizzati. Anche un completamente vuoto while(1); è utile per un reset assistito da watchdog. La terminazione ma i cicli vuoti possono anche essere utili nello sviluppo integrato.

C'è un modo elegante per dire in modo specifico al compilatore di non rimuovere loop vuoti o infiniti, senza disabilitare del tutto l'ottimizzazione?

risposta

9

Uno dei requisiti per un ciclo per essere rimosso (come menzionato in questa domanda) è che

  • non accede o modificare oggetti volatili

Quindi,

void wait_forever(void) 
{ 
    volatile int i = 1; 
    while (i) ; 
} 

fare il trucco, anche se certamente lo verificherei osservando lo smontaggio di un programma prodotto con la tua particolare toolchain.

Una funzione come questo sarebbe un buon candidato per l'attributo di GCC noreturn pure.

void wait_forever(void) __attribute__ ((noreturn)); 

void wait_forever(void) 
{ 
    volatile int i = 1; 
    while (i) ; 
} 

int main(void) 
{ 
    if (something_bad_happened) 
     wait_forever(); 
} 
+0

Does 'wait_forever()' deve ancora leggere il volatile 'i' se ha l'attributo' noreturn'? Se sì, allora quale problema risolve questo attributo? – Ruslan

+1

Come menzionato nella documentazione GCC collegata, 'noreturn' dice al compilatore che l'esecuzione non può mai continuare dopo aver chiamato una funzione' noreturn'. Pertanto, non è necessario emettere * qualsiasi * codice dopo una chiamata a tale funzione. –

Problemi correlati