Для меня, в GCC 4.7.0, пустой asm все равно был оптимизирован с -O3 (не пытался с -O2).и использование i ++ в регистре или volatile привело к значительному снижению производительности (в моем случае).
То, что я делал, связывалось с другой пустой функцией, которую компилятор не мог видеть при компиляции «основной программы»
В основном это:
Создан "helper.c" с объявленной функцией (пустая функция)
void donotoptimize(){}
Затем скомпилирован "gcc helper.c -c -o helper.o"а затем
while (...) { donotoptimize();}
Это дало мне лучшие результаты (и, по моему мнению, никаких накладных расходов, но не может протестировать, потому что моя программа не будет работать без него :))
Я думаю, что это должно работать с ICC тоже.Может быть, нет, если вы включаете оптимизацию компоновки, но с помощью gcc это происходит.