Ответ 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
, за исключением того, что вам нужно, чтобы объект имел статическую продолжительность хранения и был недоступен из других единиц перевода.