Тип переменной 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 , указатели и т.д.). Регистровые переменные инициализируются каждый раз при входе в функцию или блок. Для регистровых переменных инициализирующее выражение не обязательно должно быть константой: оно может быть любым выражением, включающим определенные ранее величины и обращения к функциям.
Если явная инициализация отсутствует, то регистровые переменные имеют в таком случае неопределенные значения.
Следует заметить, что не обязательно все регистровые переменные будут действительно храниться в регистрах. Компилятор должен сравнить ваши требования с количеством доступных регистров, поэтому вы можете и не получить то, что хотите. В этом случае переменная становится простой автоматической.
К регистровым переменным не может быть применена операция «&» (получения адреса), таким образом, если в программе не используются адреса некоторых переменных, то эффективнее использовать для этих переменных регистры.
Таким образом, класс памяти определяет область действия переменной и продолжительность ее существования в памяти. Класс памяти устанавливается при описании переменной с соответствующим ключевым словом. Переменные, определенные вне функции, являются автоматическими и локальными, если только не используются другие ключевые слова. Внешние переменные, определенные раньше функции, доступны ей, даже если не описаны внутри ее.
| Автоматический | auto | Временно | Локальная |
| Статический | static | Постоянно | Локальная |
| Регистровый | register | Временно | Локальная |
| Внешний | extern | Постоянно | Глобальная (все файлы) |
| Внешний статический | static | Постоянно | Глобальная (один файл) |
Классы памяти, перечисленные в первой таблице, описываются внутри функции. Классы памяти, перечисленные во второй таблице, описываются вне функции.
На следующем шаге мы познакомимся с рекурсией.