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

Когда мне следует использовать const volatile, зарегистрировать volatile, static volatile в C++?

Мне интересно о различных применениях ключевого слова volatile в сочетании с register, const и static ключевые слова. Я не уверен, каковы эффекты, поэтому я думаю:

register volatile int T=10;

Предложите компилятору сохранить T в регистре, а значение T можно изменить где-то снаружи (ОС, аппаратное обеспечение, другой поток)

const volatile int T=10;

Сама программа не может изменять T, но T может быть изменена где-то вне кода.

static volatile int T=10;

Если T является членом данных класса, это означает, что все объекты класса имеют одинаковое значение для T и T, которые могут быть изменены извне. Если T - глобальная переменная в файле, исходный код в других файлах (которые являются частью проекта) не может получить доступ к T, но T может быть доступен откуда-то снаружи. Если T - локальная переменная в функции, то после ее инициализации остается в памяти до конца программы и может быть изменена где-то снаружи.

Верны ли мои мысли и может ли любой опытный разработчик С++ привести пример, где вышеупомянутое может быть использовано в реальных приложениях или оно очень редко?

4b9b3361

Ответ 1

register volatile int T=10;

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

Практическое использование:

Я никогда не использовал его, он никогда не ощущал необходимости в нем и не мог сейчас думать ни о чем.


const volatile int T=10;

const означает, что T не может быть изменен с помощью кода. Если вы попытаетесь сделать это, компилятор предоставит диагностику. volatile по-прежнему означает то же, что и в случае 1. Компилятор не может оптимизировать или изменить порядок доступа к T.

Практическое использование:

  • Доступ к общей памяти в режиме только для чтения.
  • Доступ к аппаратным регистрам в режиме только для чтения.

static volatile int T=10;

static классификатор хранения предоставляет T статическую длительность хранения (С++ 11 §3.7) и внутреннюю привязку, а volatile все еще управляет оптимизацией и переназначения.

Практическое использование:

  • То же, что и volatile, за исключением того, что вам нужно, чтобы объект имел статическую продолжительность хранения и был недоступен из других единиц перевода.