Rambler's Top100 Service калинин.ru / программирование / c и c++ /  << 12.09.00 >>

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)
   Плохое комментирование исходных текстов является одним из самых тяжелых заболеваний программ. Причем программисты зачастую путают "хорошее" комментирование и "многословное". Согласитесь, комментарии...   >>>>
  Рядом по дате:
Еще один способ подготовки копии конспекта лекций (13.09.00)
   Вопрос о том, где же добыть лекции, мучает каждого студента перед сессией. Вообще говоря, я не знаю, может быть в других...   >>>>
Рекурсия, часть II (11.09.00)
   Собственно, в своей я рассказал немного не о том, о чем хотел. Поэтому сегодня придется дополнять ;) Кроме того, что рекурсия...   >>>>
  Содержание:
Заглавная страница
Мой блог
Мое резюме
Дайджест
Программирование
   C&C++
Сети
Unix
Алгоритмы
Оптимизация
Соревнования
Отвлеченно
XML
TeX
Просто так
Студенческое
Туризм
  Байки
Фотографии
Комментарии
   Книги
Web-ресурсы
Фильмы
Интернет
Программное обеспечение
Жизнь
Благодарности
Форум
Хронология
 
  В этом разделе:
Простой, но полезный аллокатор памяти (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-ресурсы
Фильмы
Интернет
Программное обеспечение
Жизнь
Студенческое
Просто так
Благодарности
Форум
Хронология
© 2000-2008, Andrey L. Kalinin
mailto:andrey@kalinin.ru
Rambler's Top100