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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.73
Tamoren
0 / 0 / 0
Регистрация: 08.01.2012
Сообщений: 37
#1

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

08.01.2012, 02:03. Просмотров 1888. Ответов 4
Метки нет (Все метки)

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

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

Пример использования функции extern - C++
Доброго времени суток форумчане! Пытаюсь закрыть долг по программированию, но препод очень жесткий и просто так ставить ставить зачет мне...

Приведите пример использования оператора switch - C++
напишите пожалуйста простенькую программу с оператором "switch"

Итераторы (пример использования итератора для шаблона, к примеру списка) - C++
Доброго времени суток. Форумчани, приведите пожалуйста пример использования итератора для шаблона, к примеру списка. Зараннее благодарен. И...

Смысл спецификатора mutable - C++
В этом тема и заключается %-)

Пример использования генератора случайных чисел для демонстрации динамического полиморфизма - C++
Пример использования генератора случайных чисел для демонстрации динамического полиморфизма.Я в шоке не могу не где найти может тут кто...

Нужно просто 3 спецификатора прописать - C++
нужно чуть переделать программу, тоисть задействовать 3 спецификатора (типа void Enter, void Summ, void Exit) помогите товарищи... ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nick Alte
Эксперт С++
1608 / 1000 / 118
Регистрация: 27.09.2009
Сообщений: 1,931
Завершенные тесты: 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
Эксперт С++
1608 / 1000 / 118
Регистрация: 27.09.2009
Сообщений: 1,931
Завершенные тесты: 1
08.01.2012, 18:25     Пример использования спецификатора volatile #4
Цитата Сообщение от Tamoren Посмотреть сообщение
Если этой переменной между строками А и Б присвоить какое-то (любое допустимое) значение, то тогда в строке Б компилятор будет вынужден опять опросить переменную clock?
Смотря как присвоить. Если безусловно, то может воспользоваться последним присвоенным значением. Если присваивали в зависимости от условия, то скорее всего прочитает (если только не сумеет заоптимизировать условие). А может, даже без условия всё равно возьмёт и прямо прочитает. Тут как карта ляжет.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.01.2012, 12:46     Пример использования спецификатора volatile
Еще ссылки по теме:

volatile - C++
зачем нужно ключевое слово volatile?

исследование volatile - C++
Здравствуйте. В университете дали задание: "Исследование квалификаторов volatile и инструкции барьера памяти LOCK в VS для разного...

const volatile - C++
Пример из Шилдт Г. "С++ Базовый курс (3-е издание, 2010)" стр 205 const volatile unsigned char *port = (const volatile char *)...

const_cast: const и volatile - C++
Как известно const_cast сбрасывает наложенные ограничения при помощи модификаторов const и volatile. Как мне стало известно volatile -...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Evg
Эксперт CАвтор FAQ
17545 / 5783 / 370
Регистрация: 30.03.2009
Сообщений: 15,930
Записей в блоге: 26
09.01.2012, 12:46     Пример использования спецификатора volatile #5
Инициализация статического массива
Yandex
Объявления
09.01.2012, 12:46     Пример использования спецификатора volatile
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru