С ИСО / МЭК 9899: 201x сечение 5.1.2.3 Выполнение программы:
2 Доступ к энергозависимому объекту ,изменение объекта, изменение файла или вызов функции, которая выполняет любую из этих операций : all побочные эффекты , которые являются изменениями в состоянии среды выполнения.Оценка выражения в целом включает в себя как расчет стоимости, так и инициирование побочных эффектов.Вычисление значения для выражения lvalue включает в себя определение идентичности назначенного объекта.
Таким образом, доступ к (чтение \ запись) энергозависимому называется побочным эффектом.Давайте продолжим:
4 В абстрактной машине все выражения оцениваются в соответствии с семантикой. Фактическая реализация не должна оценивать часть выражения, если она может сделать вывод, что ее значение не используется и что не возникает никаких побочных эффектов (включая любые, вызванные вызовом функции или обращением к энергозависимому объекту) .
Поэтому, если я читаю volatile (что является побочным эффектом), но ничего не делает с выбранным значением, которое я прочитал, этот доступ фактически не нужен и его можно оптимизировать.
OKтакже:
6 Минимальные требования к соответствующей реализации:
Доступ к летучим объектам оценивается строго в соответствии с правиламиабстрактная машина .
При завершении программы все данные, записанные в файлы, должны быть идентичны результату, который получилось бы при выполнении программы в соответствии с абстрактной семантикой.
Динамика ввода и вывода интерактивных устройств должна соответствовать указанным в 7.21.3.Цель этих требований заключается в том, чтобы небуферизованные или строковые буферизованные выходные данные появлялись как можно скорее, чтобы гарантировать, что побуждающие сообщения действительно появляются до того, как программа ожидает ввода.Это наблюдаемое поведение программы.
Итак, насколько я понимаю, секция 4 является правилом абстрактной машины, а секция 6 говорит, что летучие вещества должны оцениваться строго в соответствии с правилами абстрактной машины (какой раздел 4 есть).Таким образом, доступ для чтения (без дальнейшего использования извлеченного значения) может быть оптимизирован.
Итак, взгляните на этот код:
volatile int *timer_reg = REGISTER_ADDRESS_CONST;
while (*timer_reg == 0) {/*empty loop*/}
Этот код блокирует выполнение до HWнемного поднимается по адресу, указанному timer_reg
.Этот регистр действует как своего рода таймер, который был настроен на повышение по истечении определенного периода времени.Когда таймер истекает, ожидание занятости заканчивается и выполнение продолжается.
Теперь, можно ли оптимизировать этот цикл while
?Я пробовал это со многими онлайн-компиляторами с разными уровнями оптимизации, и, похоже, это не так.Есть что-то, чего я здесь не хватает?насколько я понимаю, стандарт говорит, что он может быть оптимизирован.
РЕДАКТИРОВАТЬ: Моя точка зрения заключается в том, что из-за того, что цикл while пуст, возможно, компилятор может считать извлеченное значение volatile ненужным.