Форум программистов, компьютерный форум CyberForum.ru

Пример использования спецификатора volatile - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.73
Tamoren
0 / 0 / 0
Регистрация: 08.01.2012
Сообщений: 37
08.01.2012, 02:03     Пример использования спецификатора volatile #1
В приложенной картинке (из книги Г.С. Шилдта по C++) есть пример использования спецификатора volatile. Есть три вопроса.
Первый: что вообще написано в зеленой строке? Переменная будет опрашиваться (и получать данные "извне") всегда после того как она "побывала" слева от оператора присваивания?
Второй: с чего вдруг если в строке А переменная была опрошена (для присваивания), она не будет опрошена в строке Б (для вывода на экран)? То есть получается что в строке А она опрашивалась для получения значения, а далее (при определении без спецификатора volatile) просто будет использоваться уже полученное значение?
Третий: почему в красной строке нет ошибки? Ведь если значение clock в строке Б изменится, то мы получим верный результат. По логике нужно было написать, что "ДАЖЕ если сигналы времени поступят, то значение clock не изменится, т.к. нет volatile, и строка Б не отобразит верный результат"!
Объясните пожалуйста...

P.S.: Описывается тот самый "наихудший" случай
Миниатюры
Пример использования спецификатора volatile  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.01.2012, 02:03     Пример использования спецификатора volatile
Посмотрите здесь:

C++ const volatile
C++ исследование volatile
Смысл спецификатора mutable C++
C++ const_cast: const и volatile
C++ Что такое "volatile int"
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nick Alte
Эксперт С++
1561 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,896
Завершенные тесты: 1
08.01.2012, 12:34     Пример использования спецификатора volatile #2
Первый:
В зелёной строке написано, что после того, как выполнилась строка A, но ещё не выполнилась строка Б, переменную clock могут изменить извне (то есть, вообще не из этой программы). Переменная может опрашиваться и получать данные извне (без кавычек) в любой момент после того, как эти внешние силы вообще узнали о существовании такой переменной. Но компилятор-то такие вещи не отслеживает, он о них знать не может, а знает только о том, что ты описываешь в рамках своей программы. И изначально он исходит из предположения, что переменные твоей программы только ей и изменяются. На этом основании он может иногда и схитрить, оптимизировать те или иные операции. Скажем, если он видит, что переменной присвоено какое-то значение, а потом эта переменная используется, он может вместо чтения переменной сразу подставить то исходное значение. А если эта переменная больше ни для чего не использовалась, может и вообще её выкинуть нафиг. Спецификатор volatile говорит ему, что переменная может меняться не только внутри твоей программы, и тогда компилятор начинает быть настороже. Он уже не станет подставлять то исходное значение, а честно прочитает реальное содержимое переменной.

Второй:
Она может быть не опрошена по той причине, что компилятор видит, что в твоей программе этой переменной ничего не присваивается и предполагает, что её значение не изменилось. Так что он в целях ускорения и уменьшения кода оптимизирует эту операцию и подставит прежнее значение. Спецификатор volatile говорит ему, что значение переменной всё равно могло измениться и он честно будет читать его каждый раз.

Третий:
Имеется в виду, что на момент выполнения строки Б настоящее значение clock изменится, но поскольку оптимизатор подсунет нам предыдущее значение вместо того, чтобы прочесть реальное, мы получим неверный результат.
Tamoren
0 / 0 / 0
Регистрация: 08.01.2012
Сообщений: 37
08.01.2012, 16:41  [ТС]     Пример использования спецификатора volatile #3
Цитата Сообщение от Nick Alte Посмотреть сообщение
он может вместо чтения переменной сразу подставить то исходное значение
Во, самое оно! Один ответ на три вопроса =) Я правильно понимаю, что переменная clock таки будет изменяться извне на протяжении всей программы?
"Извне" - имелось ввиду, что это не сарказм, а какая-то программа, о которой мы не знаем.
И вот конкретно, что значит: "разрешается оптимизировать в предположении, что содержимое той или иной переменной остается неизменным, если оно не находится в левой части инструкции присваивания". Если этой переменной между строками А и Б присвоить какое-то (любое допустимое) значение, то тогда в строке Б компилятор будет вынужден опять опросить переменную clock?
Nick Alte
Эксперт С++
1561 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,896
Завершенные тесты: 1
08.01.2012, 18:25     Пример использования спецификатора volatile #4
Цитата Сообщение от Tamoren Посмотреть сообщение
Если этой переменной между строками А и Б присвоить какое-то (любое допустимое) значение, то тогда в строке Б компилятор будет вынужден опять опросить переменную clock?
Смотря как присвоить. Если безусловно, то может воспользоваться последним присвоенным значением. Если присваивали в зависимости от условия, то скорее всего прочитает (если только не сумеет заоптимизировать условие). А может, даже без условия всё равно возьмёт и прямо прочитает. Тут как карта ляжет.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16821 / 5242 / 318
Регистрация: 30.03.2009
Сообщений: 14,118
Записей в блоге: 26
09.01.2012, 12:46     Пример использования спецификатора volatile #5
Инициализация статического массива
Yandex
Объявления
09.01.2012, 12:46     Пример использования спецификатора volatile
Ответ Создать тему
Опции темы

Текущее время: 02:10. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru