È qualcosa di terribilmente non portatile.
In alcuni compilatori una di queste opere può (ma si controlla con piena ottimizzazione abilitata, l'istruzione vuota può essere gettato via):
for (i = 0; i < spinCount;)
++i; // yes, HERE
o:
for (i = 0; i < spinCount; ++i)
((void)0);
Se E 'abbastanza fortunato che il tuo compilatore possa fornire una macro o una funzione intrinseca che verrà compilata nell'istruzione di assemblaggio nop
, qualcosa come __noop
in MSVC.
Come ultima risorsa si può semplicemente aggiungere una singola istruzione di montaggio (è compilatore dipendente, può essere __asm o qualcosa di simile) per eseguire ... niente, in questo modo:
for (i = 0; i < spinCount; ++i)
__asm nop
o (controllare il vostro compilatore documentazione):
for (i = 0; i < spinCount; ++i)
asm("nop");
EDIT
Se non si dispone di un'istruzione noop
e non è possibile aggiungere il codice assembly (mi dispiace, che tipo di com piler che stai usando?) puoi contare sul presupposto che un'istruzione con un effetto collaterale non verrà ottimizzata (o, come pubblicato da @ouah, un accesso a una variabile dichiarata volatile
).
fonte
2012-04-24 14:59:10
http://stackoverflow.com/questions/3527829/is-this -a-bug-in-the-intel-c-compiler-icc/3527862 # 3527862 –
sì ............ –
'noi'? se funziona questo codice, deve essere una CPU molto lenta. –