Изменчивая переменная
Где переменная volatile хранится в памяти программы (в каком разделе)?
Ответы
Ответ 1
volatile
является классификатором типов, а не спецификатор класса хранения, поэтому он вообще не определяет место хранения; это влияет на определение типа переменной, а не на его хранение.
Он просто заставляет компилятор явно читать переменную, тип которой volatile
из места хранения переменных (где бы это ни было), а не предполагать, что некоторое ранее прочитанное значение в регистре, например, остается в силе.
Ответ 2
В C volatile
просто сообщает компилятору: "У вас недостаточно знаний, чтобы предположить, что значение этой переменной не изменилось". Для этого нет "раздела", например BSS, CSS.
Рассмотрим это как флаг для компилятора для предотвращения определенных типов оптимизаций. Его очень удобно в встроенном программировании, где память на определенном адресе может "изменяться" из-за ввода аппаратного устройства.
Вот хорошее объяснение: http://www.embedded.com/columns/programmingpointers/174300478?_requestid=137658
Ответ 3
Волатильность переменной не изменяет место хранения переменной. Что это изменяет, так это семантика вокруг того, как она доступна для чтения и записи.
Я не верю, что в стандарте C ничего не говорится об осуществлении изменчивости. Но, как правило, волатильные гарантии освобождают семантику для операций записи с переменной семантики переменных и ресурсов для операций чтения переменной. Это будет не верно для каждой реализации, хотя и вы должны прочитать, что ваш конкретный компилятор гарантирует
Ответ 4
volatile не имеет отношения к классу хранения.
volatile просто сообщает компилятору или заставляет компилятор "не выполнять оптимизацию" для этой переменной.
поэтому компилятор не будет оптимизировать код для этой переменной и считывать значение из указанного местоположения, а не через промежуточный регистр, который сохраняет предыдущее значение.
Таким образом, объявляя переменную как изменчивой, она дает гарантию, что вы получите последнее значение, которое может быть изменено внешним событием.
ваш код может работать нормально, если он не объявляет эту переменную нестабильной, но иногда может возникнуть вероятность не получить правильное значение.
поэтому, чтобы избежать этого, мы должны объявить переменную как изменчивую.
volatile обычно используется при работе с внешними событиями, такими как прерывания связанных с аппаратным обеспечением контактов.
Пример.
чтение значений adc.
const voltile означает
вы не можете изменять или изменять значение этой переменной в коде. только внешнее событие может изменить значение.
Контрольные контакты обычно определяются как изменчивые.
может быть, объявив переменную, поскольку энергозависимый контроллер будет "читать по штырю", а не "читать защелкой"... это мое предположение. может быть неправильным...
но все же есть много путаницы, когда выбирать переменную как неустойчивую.
Переменная должна быть объявлена изменчивой, когда ее значение может неожиданно измениться. На практике могут изменяться только три типа переменных:
-
Перечисленные периферийные регистры с памятью
-
Глобальные переменные, модифицированные службой обслуживания прерываний
-
Глобальные переменные в многопоточном приложении
Ссылка: http://eetimes.com/discussion/beginner-s-corner/4023801/Introduction-to-the-Volatile-Keyword
Таким образом, в таких случаях предлагается переменная как неустойчивая.
Ответ 5
Нет никаких причин для сохранения изменчивой переменной в любом "специальном" разделе памяти. Он обычно хранится вместе с любыми другими переменными, включая энергонезависимые. Если какой-то компилятор решает хранить изменчивые переменные в каком-то специальном разделе памяти - ничего не мешает ему это сделать. Но на уровне языка нет никаких оснований для этого.
Почему вы задаете такой вопрос? Что заставило вас думать, что оно должно храниться в каком-то специальном разделе памяти?
Ответ 6
"Летучие" использовались в спецификациях C/С++ для использования устройств с отображением памяти. Он направляет компилятор не оптимизировать переменную, определенную с помощью этого ключевого слова, просто потому, что переменная, похоже, не изменяет ее состояние в коде, видимом для компилятора.