Оптимизация разрешена для летучих объектов - PullRequest
4 голосов
/ 05 апреля 2019

С ИСО / МЭК 9899: 201x сечение 5.1.2.3 Выполнение программы абзац 4 :

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

Что именно является здесь разрешенной оптимизацией в отношении летучего объекта?может ли кто-нибудь привести пример энергозависимого доступа, который CAN может быть оптимизирован?

Поскольку доступ с помощью volatiles является наблюдаемым поведением (описанным в параграфе 6 ), кажется, что нетОптимизация может занять, пожалуйста, в отношении летучих, поэтому мне интересно узнать, какая оптимизация разрешена в разделе 4 .

Ответы [ 5 ]

7 голосов
/ 05 апреля 2019

Небольшое переформатирование:

An actual implementation need not evaluate part of an expression if:

  a) it can deduce that its value is not used; and

  b) it can deduce that that no needed side effects are produced (including any
     caused by calling a function or accessing a volatile object).

Изменение логики без изменения значения:

An actual implementation must evaluate part of an expression if:

  a) it can't deduce that its value is not used; or

  b) it can't deduce that that no needed side effects are produced (including
      any caused by calling a function or accessing a volatile object).

Упрощение, чтобы сосредоточиться на летучей части:

An actual implementation must evaluate part of an expression if needed
side effects are produced (including accessing a volatile object).
2 голосов
/ 05 апреля 2019

Доступ к летучим объектам должен быть оценен. Фраза «включая любые ...» изменяет «побочные эффекты». Она не изменяет «если она может вывести…». Она имеет то же значение, что и:

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

Это означает, что «побочные эффекты» включают в себя побочные эффекты, вызванные доступом к летучему объекту. Чтобы решить, что он не может оценить часть выражения, реализация должна сделать вывод, что не возникает никаких побочных эффектов, в том числе вызванных вызовом функции или обращением к энергозависимому объекту.

Это не означает, что реализация может отбросить оценку части выражения, даже если это выражение включает в себя доступ к энергозависимому объекту.

2 голосов
/ 05 апреля 2019

Добавив еще один пример, который вписывается в это в моем понимании:

volatile int vol_a;
....
int b = vol_a * 0; // vol_a is not evaluated
2 голосов
/ 05 апреля 2019

Может ли кто-нибудь привести пример нестабильного доступа, который МОЖЕТ быть оптимизирован? прочь?

Я думаю, что вы неверно истолковали текст, ИМО, этот абзац означает, что

volatile unsigned int bla = whatever();

if (bla < 0) // the code is not evaluated even if a volatile is involved
0 голосов
/ 05 апреля 2019

В тех случаях, когда доступ к энергозависимому объекту будет влиять на поведение системы таким образом, который необходим для того, чтобы программа достигла своей цели, такой доступ не следует исключать.Если доступ не окажет никакого влияния на поведение системы, то операция может быть «выполнена» на абстрактной машине без выполнения каких-либо инструкций.Тем не менее, было бы редко, чтобы автор компилятора знал с уверенностью, что эффект выполнения инструкций для выполнения доступа будет таким же, как эффект от притворства выполнять эти инструкции на абстрактной машине, пропуская их на реальной.

В гораздо более распространенном сценарии, когда разработчик компилятора не знает о каком-либо эффекте, который может иметь изменчивый доступ, но также не имеет особой причины полагать, что такой доступ не может иметь эффекты, о которых автор компилятора не знает (например, из-за аппаратного обеспечения, которое запускается операциями с определенными адресами), автору компилятора придется учитывать возможность того, что такие обращения могут иметь «интересные» эффекты, выполняя их вуказанной последовательности, независимо от того, знает ли автор компилятора какую-либо конкретную причину, по которой последовательность операций должна иметь значение.

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