Можно ли оптимизировать этот изменчивый доступ? - PullRequest
0 голосов
/ 03 апреля 2019

С ИСО / МЭК 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 ненужным.

1 Ответ

3 голосов
/ 03 апреля 2019

Так что, если я читаю энергозависимый (что является побочным эффектом) без использования прочитанного значения, этот доступ фактически не нужен и может быть оптимизирован.

Нет.В тексте написано «его значение не используется и , что не вызывает побочных эффектов» .Здесь не написано " или ".Независимо от того, используете ли вы значение, присутствует побочный эффект - доступ к энергозависимой переменной.

Таким образом, доступ для чтения (без дальнейшего использования извлеченного значения) может быть оптимизирован.

Нет.

Теперь, можно ли оптимизировать этот цикл while?

Нет.Данные, на которые указывают данные, являются неопределенными.На каждом круге в цикле он должен читать *timer_reg непосредственно из памяти.Это может не оптимизировать прочтение.Это не может изменить порядок.Он может не кэшировать / предварительно извлекать его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...