volatile
Автор
И опять я публикую здесь текст из конференции SU.C_CPP. Впору заводить
для этого отдельный раздел ;)
Автор этого письма, Александр Кротов, является человеком,
который умеет цитировать стандарт языка C++. Это, кстати, очень
сложно: ведь нужно помнить что и где находится, что бы при
ответе на вопрос сразу же дать нужный пункт стандарта. Собственно, цитируемое
ниже письмо, как мне кажется, может предоставлять некоторый интерес со стороны
программистов на C++. Опять же, делаю автору (Александру) всевозможные реверансы и
прошу всяческих прощений за использование его письма в своем разделе. Еще раз повторяю ---
автор текста ниже не я, а Александр Кротов (давать его почтовый адрес не хочу, потому
что на меня уже сыпется спам и, я уверен, на любой почтовый адрес упомянутый на страничке,
он тоже будет сыпаться; интересующееся адресом Александра, могут спросить у меня).
Письмо датировано 21 апрелем 1999 года.
|
Hапример, в тех
случаях, когда x объявлен с модификатором volatile (насколько я понимаю,
volatile lvalue должен быть физически "взят" вне зависимости от того, с какой
стороны от знака операции присваивания он находится; первая запись в этом
случае просто не будет иметь определенного смысла, я думаю).
А вот пример мне не нравится. Обычно под побочными эффектами подразумевают
нечто иное.
И насчет volatile тут ты тоже не совсем прав. Точное значение volatile
по стандарту зависит от компилятора, по этому есть смысл говорить только о
том, что компиляторы "как правило" делают с volatile переменными.
Hапример есть целый класс оптимизаций связанных с value numbering.
Оптимизации из этого класса позволяют, например, выделять общеие подвыражения
(local/global common subexpressions), выносить из цикла инвариантные
вычисления, а то и совмещать эти две приятные процедуры (partial redundancy
elimination, например популярный сейча lazy code motion aka LCM).
Для всех этих оптимизаций уже придуманы хорошие формальные модели, которые,
в свою очередь, уже много где описаны ;-) Так что есть смысл ожидать того,
что в том компиляторе, которым ты пользуешься они хотя-бы частично
реализованы.
Так вот, к чему я это все. Как правило volatile отражается именно на
таких оптимизациях. (В формализмах учесть этот самый volatile
очень легко).
В твоем примере
volatile int x;
x = x^n;
или
x ^= n;
особой разницы нет. В первом случае значение x прочитано и тутже
перезаписано. Очень грубо чтение и запись можно считать атомарными.
Во втором случае имеем (столь же грубо) одну атомарную операцию.
Здесь то, что x - volatile на результате не может отразиться.
Примеры, где volatile может сыграть:
int a, b, c, d;
...
c = x+a+b;
... // код не меняющий ни x, ни a
d = x+a;
Здесь (x+a) - общее подвыражение, и если x - volatile, то компилятор
скорее всего не будет его оптимизировать.
Другой пример
while (x<5) {
// что-то не меняющее x
};
Здесь очевидно, что условие цикла, не будь x - volatile, не
меняется. То есть его можно соптимизировать вынеся лишние вычисления
из цикла
if (x<5)
while(1) {
// ....
}
Если же x - volatile компилятор скорее всего такой оптимизации делать
не будет.
Версия для печати
| | Ссылки по теме: |
 |
| Бъерн Страуструп |
| |
Язык программирования C++, 3 издание.
|
|
 |
|
| | Рядом в разделе: |
 |
| Инварианты внутри программы (18.09.00) |
| |
Вы когда-нибудь задумывались, над тем, как вы пишите программы? Если нет, то, я думаю, сегодняшняя заметка будет вам полезна. Итак, как... >>>>
|
| Комментарии (30.08.00) |
| |
Плохое комментирование исходных текстов является одним из самых тяжелых заболеваний программ. Причем программисты зачастую путают "хорошее" комментирование и "многословное". Согласитесь, комментарии... >>>>
|
|
 |
|
| | Содержание: |
 |
|
|
| | В этом разделе: |
 |
| Простой, но полезный аллокатор памяти (18.02.03) |
| |
Эта заметка --- продолжение "Postfix изнутри" в том смысле, что в качестве примера опять берется postfix. Но если в прошлый раз... >>>>
|
| C или C++? (09.07.01) |
| |
Существуют два диаметрально противоположенных, но одинаково распространенных мнения, которые можно выразить как "C++ это C с классами" и "C++ и C... >>>>
|
| Религия и goto (14.04.01) |
| |
Начнем несколько издалека. В программировании существует тенденция к алгоритмизации самого процесса программирования. То есть, выведение некоторых универсальных правил, использование которых в... >>>>
|
| ploticus (16.10.00) |
| |
Есть такая программа, предназначенная для создания графиков различных видов из командной строки, называется ploticus. Программа сама по себе достаточно удобная ---... >>>>
|
| Шаманство, или ошибки работы с памятью (25.09.00) |
| |
Когда программа становится внушительной по своему содержанию (то есть, не по количеству строчек, а по непонятности внутренних связей), то ее поведение... >>>>
|
| Библиотека консорциума W3, libwww (20.09.00) |
| |
Популярный нынче термин "веб-программирование" обычно подразумевает под собой программирование, в лучшем случае, на perl, в худшем --- на PHP, в совсем... >>>>
|
| Инварианты внутри программы (18.09.00) |
| |
Вы когда-нибудь задумывались, над тем, как вы пишите программы? Если нет, то, я думаю, сегодняшняя заметка будет вам полезна. Итак, как... >>>>
|
| Содержание раздела полностью... |
| |
Примерно в тоже время |
 |
| Еще один способ подготовки копии конспекта лекций (13.09.00) |
| |
Вопрос о том, где же добыть лекции, мучает каждого студента перед сессией. Вообще говоря, я не знаю, может быть в других... >>>>
|
| Рекурсия, часть II (11.09.00) |
| |
Собственно, в своей я рассказал немного не о том, о чем хотел. Поэтому сегодня придется дополнять ;) Кроме того, что рекурсия... >>>>
|
| Хронология полностью... |
| |
Содержание |
 |
| Заглавная страница |
| Мой блог |
| Мое резюме |
| Дайджест |
| Программирование |
| |
C&C++
Сети
Unix
Алгоритмы
Оптимизация
Соревнования
Отвлеченно
XML
|
| TeX |
| Туризм |
| |
Байки
Фотографии
|
| Комментарии |
| |
Книги
Web-ресурсы
Фильмы
Интернет
Программное обеспечение
Жизнь
|
| Студенческое |
| Просто так |
| Благодарности |
| Форум |
| Хронология |
|