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

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

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

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

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

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

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

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

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

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

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

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

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

4
Nick Alte
Эксперт С++
1639 / 1011 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
08.01.2012, 12:34 #2
Первый:
В зелёной строке написано, что после того, как выполнилась строка A, но ещё не выполнилась строка Б, переменную clock могут изменить извне (то есть, вообще не из этой программы). Переменная может опрашиваться и получать данные извне (без кавычек) в любой момент после того, как эти внешние силы вообще узнали о существовании такой переменной. Но компилятор-то такие вещи не отслеживает, он о них знать не может, а знает только о том, что ты описываешь в рамках своей программы. И изначально он исходит из предположения, что переменные твоей программы только ей и изменяются. На этом основании он может иногда и схитрить, оптимизировать те или иные операции. Скажем, если он видит, что переменной присвоено какое-то значение, а потом эта переменная используется, он может вместо чтения переменной сразу подставить то исходное значение. А если эта переменная больше ни для чего не использовалась, может и вообще её выкинуть нафиг. Спецификатор volatile говорит ему, что переменная может меняться не только внутри твоей программы, и тогда компилятор начинает быть настороже. Он уже не станет подставлять то исходное значение, а честно прочитает реальное содержимое переменной.

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

Третий:
Имеется в виду, что на момент выполнения строки Б настоящее значение clock изменится, но поскольку оптимизатор подсунет нам предыдущее значение вместо того, чтобы прочесть реальное, мы получим неверный результат.
2
Tamoren
0 / 0 / 0
Регистрация: 08.01.2012
Сообщений: 37
08.01.2012, 16:41  [ТС] #3
Цитата Сообщение от Nick Alte Посмотреть сообщение
он может вместо чтения переменной сразу подставить то исходное значение
Во, самое оно! Один ответ на три вопроса =) Я правильно понимаю, что переменная clock таки будет изменяться извне на протяжении всей программы?
"Извне" - имелось ввиду, что это не сарказм, а какая-то программа, о которой мы не знаем.
И вот конкретно, что значит: "разрешается оптимизировать в предположении, что содержимое той или иной переменной остается неизменным, если оно не находится в левой части инструкции присваивания". Если этой переменной между строками А и Б присвоить какое-то (любое допустимое) значение, то тогда в строке Б компилятор будет вынужден опять опросить переменную clock?
0
Nick Alte
Эксперт С++
1639 / 1011 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
08.01.2012, 18:25 #4
Цитата Сообщение от Tamoren Посмотреть сообщение
Если этой переменной между строками А и Б присвоить какое-то (любое допустимое) значение, то тогда в строке Б компилятор будет вынужден опять опросить переменную clock?
Смотря как присвоить. Если безусловно, то может воспользоваться последним присвоенным значением. Если присваивали в зависимости от условия, то скорее всего прочитает (если только не сумеет заоптимизировать условие). А может, даже без условия всё равно возьмёт и прямо прочитает. Тут как карта ляжет.
1
Evg
Эксперт CАвтор FAQ
18026 / 6258 / 427
Регистрация: 30.03.2009
Сообщений: 17,193
Записей в блоге: 27
09.01.2012, 12:46 #5
Инициализация статического массива
0
09.01.2012, 12:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.01.2012, 12:46
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

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