Подтвердить что ты не робот

Ключевое слово volatile в языке C?

У меня вопрос о volatile на языке C.

Я прочитал некоторый учебник, но все еще не могу понять, некоторые говорят, что volatile сообщает оптимизатору-компидиенту, что операции с этой переменной не должны оптимизироваться определенными способами. это означает, что в любое время значение переменной изменяется в регистре, тогда значение должно влиять на память.

А также некоторые говорят, что volatile означает, что значение может быть изменено с помощью вне этого кода.

Я не могу понять второе высказывание, так что изменчивая переменная может быть изменена средствами вне этого кода? как? и эти два говорят оба правильно?

4b9b3361

Ответ 1

Утверждение "значение может быть изменено посредством вне этого кода" в основном означает, что другая программа или аппаратное обеспечение может обновить эту переменную. Это вполне возможно. Один из способов думать об этом - связать эту концепцию с файлом, который делится между несколькими программами. Файл можно открыть, записать и прочитать сразу несколькими программами. Когда вы читаете из файла, вы хотите убедиться, что вы читаете последнее обновление, а не самое старое.

Возвращаясь к ключевому слову volatile, помещая volatile перед переменной, по сути, делает то же самое. Он гарантирует, что то, что вы читаете вне переменной, не основано на оптимизации компилятора или старой копии переменной, которую имела ваша программа. Кроме того, ключевое слово volatile гарантирует, что переменная извлекается из памяти при каждом доступе. Поэтому оба эти утверждения правильны относительно ключевого слова volatile.

Ответ 2

C не обязательно для компьютеров. Например, если вы разрабатываете Game Boy Advance, вы часто сталкиваетесь с местами памяти, которые модифицируются аппаратным обеспечением, поэтому вы не можете изменять переменную в своем коде, но она все равно будет изменена. То, что означает volatile.

Добавив ключевое слово volatile, вы сообщаете компилятору, что "Значение, хранящееся в этой переменной (ячейке памяти), может измениться без использования кода my.

Ответ 3

Рассмотрим любое из следующего:

  • многопоточное приложение,
  • приложение, использующее общую память,
  • приложение, работающее на платформе, которое отображает регистры ввода-вывода в адресное пространство,
  • приложение с аппаратным DMA, встречающимся в фоновом режиме.

В каждой из этих ситуаций память может быть изменена вне текущего потока.

Обратите внимание, что "в любое время, когда значение переменной изменяется в регистре, тогда значение должно влиять на память" является правильным, просто не очень понятно.

Ответ 4

Место памяти может быть изменено вне кода программы огромным количеством способов. Например, DMA, считываемый с диска, может записывать в буфер, или устройство с отображением памяти может изменять местоположение из-за какого-либо события на устройстве.

Ответ 5

эти адреса, например, многопоточные приложения: значение переменной может быть изменено несколькими потоками и, следовательно, должно быть "синхронизировано" с памятью при каждом доступе (независимо от того, читать или записывать значение).

Ответ 6

Объявление переменной volatile означает, что вы инструктируете компилятор не оптимизировать фрагмент кода вокруг этой переменной. Это вынуждает CPU НЕ использовать значение переменной из локальных регистров или кэш-памяти, но каждый раз извлекать значение из основной памяти.