Перейти к содержимому

Register c что это

  • автор:

Тип переменной register

Какой тип у переменной объявленной с ключевым словом register ? Встретил такой код. Какой тут тип у переменной n ?

int main()

Отслеживать
задан 14 июл 2020 в 10:07
94 5 5 бронзовых знаков

это невалидный код, так как тип переменной в объявлении не указан. Ключевое слово register в языке больше ничего не делает

14 июл 2020 в 10:11
Это int. (в С, не в C++.)
14 июл 2020 в 10:14
@user7860670 с мощью gcc компилируется, с помощью g++ нет
14 июл 2020 в 10:14
в gcc он скомпилируется только с игнорированием предупреждений
14 июл 2020 в 10:17

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Register — это класс памяти объектов в си, он означает, что число перемещается в регистр. Вроде как от этого с ним операции проходят быстрее.

Также , как верно отметил avp:

register всегда был хинтом (hint, совет). Компилятор не обязан помещать такую переменную в регистр, но вправе прислушаться к такому совету, по крайней мере при оптимизации такая переменная будет более приоритетна для размещения в регистре, чем другие. / И еще, по крайней мере в старом Си тип int существовал по умолчанию (как минимум как тип возвращаемого функцией значения), поэтому его можно было не указывать вместе с хинтом

А вообще по умолчанию здесь тип int, как если бы ты написал, например, signed var

Но думаю, что смысла использовать такое нет. Видел упоминание этого типа только в книге про си 91го года.

register описатель класса хранения

Компилятор Microsoft C/C++ не учитывает пользовательские запросы на регистровые переменные. Но в целях обеспечения переносимости компилятор учитывает всю остальную семантику, связанную с ключевым словом register . Например, невозможно применить унарный оператор взятия адреса ( & ) к объекту регистра. Кроме того, register ключевое слово невозможно использовать в массивах.

Завершение блока, относящегося только к системам Майкрософт

Регистровые переменные

С имеет еще один спецификатор, который первоначально применялся только к переменным int и char. Стандарт ANSI С расширил сферу его применения. Спецификатор register просит, чтобы компилятор сохранил переменную способом, позволяющим осуществлять наибыстрейший доступ. Для целых чисел и символов это обычно подразумевает размещение не в памяти, а в регистрах процессора. Для других типов переменных компилятор может использовать другие способы для уменьшения времени доступа. Компилятор может просто игнорировать данную просьбу.

В Borland С++ спецификатор register может применяться к локальным переменным и формальным параметрам функции. Нельзя применять register к глобальным переменным. Также, поскольку регистровая переменная может быть сохранена в регистре процессора, нельзя получить адрес регистровой переменной. (Данное ограничение присутствует только в С, но не в С++)

В целом операции с регистровыми переменными выполняются гораздо быстрее, чем с переменными, сохраненными в памяти. Фактически, когда значение переменной содержится в процессоре, не требуется доступа к памяти для определения или модификации значения. Это делает регистровые переменные идеальным средством для управления циклами. Ниже приведен пример объявления регистровой переменной типа int и дальнейшего ее использования для управления циклом. Данная функция вычисляет m* для целых чисел.

int int_pwr (register int m, register int e)
register int temp;
temp = 1 ;
for( ; e; e—) temp *= m;
return temp;
>

В данном примере m, e и temp объявлены как регистровые переменные, поскольку они используются в цикле. Обычно регистровые переменные используются там, где они принесут наибольшую пользу, то есть в местах, где делается много ссылок на одну и ту же переменную. Это важно, поскольку не все переменные можно оптимизировать по времени доступа.

Важно понять, что спецификатор register — это просто запрос компилятору, который не обязательно будет удовлетворен. Как правило, можно использовать по крайней мере две регистровые переменные, размещаемые в регистрах процессора, типа char или int. Дополнительные регистровые переменные оптимизируются более продвинутыми компиляторами.

Register c что это

На этом шаге мы познакомимся с регистровыми переменными.

Объекты, описанные внутри блока с классом памяти register , называются регистровыми переменными . Они подчиняются всем правилам, касающимся автоматических переменных. Описание register указывает компилятору, что данная переменная будет часто использоваться.

Описание может выглядеть, например, так:

register int n; register char c; register int *px;

Использование регистровых переменных приводит к меньшим по размерам и более быстрым программам.

Компилятор C++ автоматически выполняет оптимальное распределение регистров в соответствии с потоком данных. Этим снята необходимость обязательного указания переменных программы как регистровых, так что описание register идентично по смыслу описанию auto и никакого другого смысла не имеет.

Регистровый класс памяти могут иметь только простые переменные ( char, int , указатели и т.д.). Регистровые переменные инициализируются каждый раз при входе в функцию или блок. Для регистровых переменных инициализирующее выражение не обязательно должно быть константой: оно может быть любым выражением, включающим определенные ранее величины и обращения к функциям.

Если явная инициализация отсутствует, то регистровые переменные имеют в таком случае неопределенные значения.

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

К регистровым переменным не может быть применена операция «&» (получения адреса), таким образом, если в программе не используются адреса некоторых переменных, то эффективнее использовать для этих переменных регистры.

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

Таблица 1. Классы памяти, определяемые внутри функции Класс памяти Ключевое слово Продолжительность существования Область действия
Автоматический auto Временно Локальная
Статический static Постоянно Локальная
Регистровый register Временно Локальная

Таблица 2. Классы памяти, определяемые вне функции Класс памяти Ключевое слово Продолжительность существования Область действия
Внешний extern Постоянно Глобальная (все файлы)
Внешний статический static Постоянно Глобальная (один файл)

Классы памяти, перечисленные в первой таблице, описываются внутри функции. Классы памяти, перечисленные во второй таблице, описываются вне функции.

На следующем шаге мы познакомимся с рекурсией.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *