volatile - это говорит только то, что значение будет браться из памяти - у Рихтера прочел. А пустой цикл оптимизируется - вовсе не причем там тип макроса ИМХО конечно.
Просто в цикле сделать надо что-то типа простейшей операции. i=i<<1;
и все будет работать.
Думаю, что насчет оптимизации ты абсолютно прав. А вот насчет простейшей операции - не уверен.
Был такой случай в практике. В конце 80-х попала в мои руки мини-ЭВМ VAX-11/725 (если кто застал те времена, помнят, что это была надежда Пентагона, очень удачная серия супермини-ЭВМ). Захотелось самому определить ее быстродействие. Для этого написал что-то вроде:
long k = 0;
for )long i = 0; i < 10000000; i++:
k = k + 1;
(на самом деле писано это было на FORTRAN77 или на Pascal, но суть не в этом). Запустил, засек время - выполняется около секунды. Ладно, думаю, в принципе возможно. Увеличил предел цикла в 10 раз - то же самое. Еще в 10 раз - то же самое :!:
Я точно знал, что миллиард коротких сложений в секунду агрегат делать не может. Стал разбираться с кодом. Оказалось, что умный компилятор понял, что значение k не используется дальше, и не стал его считать вовсе
Ладно, решил немного схитрить. Поставил в конце программы печать значения k, чтобы заставить комп его вычислить. Запускаю - то же самое. Лезу в код. Оказалось, что оптимизатор сообразил, что незачем 10000000 раз складывать по единице, и заменил все это на
а затем напечатал значение. Аналогичные простейшие уловки тоже не смогли сбить его с толку. Пришлось выдумать выражение посложнее, чтобы он не мог заранее его посчитать на этапе компиляции.
А теперь прикиньте, что с тех пор минуло лет 15, наверное... Думаю, что творцы компиляторов с тех пор вряд ли разучились оптимизировать, тем более такие элементарные вещи. Если значение
delta нигде дальше не используется, скорее всего, цикл просто будет выброшен из программы.