Класс хранения register
первоначально намекнул компилятору, что переменная, так квалифицированная, должна была использоваться так часто, что сохранение ее значения в памяти было бы недостатком производительности. огромные большинство архитектур процессора (возможно, не SPARC? Даже не уверен, что есть контрпример) не может выполнять какую-либо операцию между двумя переменными без первой загрузки одной или обеих из памяти в свои регистры. Загрузка переменных из памяти в регистры и запись их обратно в память, когда она работает, занимает много раз больше циклов процессора, чем сами операции. Таким образом, если переменная используется часто, можно добиться выигрыша в производительности, отложив для нее регистр и вообще не беспокоясь о памяти.
Выполнение этого, однако, имеет множество требований.Многие из них различны для каждой архитектуры процессора:
- Все процессоры имеют фиксированный число регистров, но каждая модель процессора имеет разное количество. В 80-е годы у вас могло быть 4, которые можно было бы разумно использовать для переменной
register
.
- Большинство процессоров не поддерживают использование каждого регистра для каждой инструкции. В 80-е годы было не редкость иметь только один регистр, который вы могли бы использовать для сложения и вычитания, и вы, вероятно, не могли использовать тот же регистр, что и указатель.
- Вызывающие соглашения продиктовали разные наборы регистров, которые можно было бы перезаписать подпрограммами, то есть вызовами функций.
- Размер регистра различается между процессорами, поэтому бывают случаи, когда переменная
register
не будет вписываться в регистр.
Поскольку C предназначен для независимости от платформы, эти ограничения не могут быть соблюдены стандартом. Другими словами, хотя может быть невозможно скомпилировать процедуру с переменными 20 register
для системы, в которой было только 4 машинных регистра, сама программа C не должна быть «неправильной», так как нет логической причины, что машина не может иметь 20 регистров , Таким образом, класс хранения register
всегда был только подсказкой , что компилятор мог игнорировать, если целевая платформа не поддерживала бы ее.
Невозможность ссылки на регистр отличается. A register
- конкретно не обновляется в памяти и не поддерживается в актуальном состоянии, если внесены изменения в память; вот в чем весь класс хранения. Поскольку они не предназначены для гарантированного представления в памяти, они не могут логически иметь адрес в памяти, который будет иметь смысл для внешнего кода, который может получить указатель. Регистры не имеют адреса для своего собственного процессора, и у них почти нет адреса, доступного для любого сопроцессора. Поэтому любая попытка получить ссылку на register
равна , всегда. Стандарт C может с комфортом обеспечить соблюдение этого правила.
По мере развития вычислительной техники, однако, некоторые тенденции развиты, что ослабило цель самого класса register
хранения:
- Процессоры пришли с большим количеством регистров. Сегодня у вас, вероятно, есть не менее 16, и, возможно, все они будут использоваться взаимозаменяемо для большинства целей.
- Многоядерные процессоры и распределенное выполнение кода стали очень распространенными; только одно ядро имеет доступ к любому регистру и никогда не делится ими без использования памяти.
- Алгоритмы выделения регистров переменным стали очень эффективными.
Действительно, компиляторы теперь настолько хорошо выделяют переменные в регистры, что они обычно лучше работают над оптимизацией, чем любой человек. Они конечно знают, какие из них вы используете чаще всего, не сообщив им. Было бы сложнее для компилятора (т. Е. Не для стандартного или для программиста) для создания этих оптимизаций, если бы они требовали соблюдать ваши руководства register
. Для компиляторов стало все чаще распространяться их категорическое игнорирование. К тому моменту, когда существовал C++, он был устаревшим. Он включен в стандарт для обратной совместимости, чтобы поддерживать C++ как можно ближе к правильному надмножеству C.Требования к компилятору, чтобы почтить намек и, следовательно, требования к обеспечению условий, при которых был намечен намек , были соответственно ослаблены. Сегодня класс хранения устарел.
Поэтому, несмотря на то, что еще дело сегодня (и будет, пока компьютеры не даже имеют регистры), которые логически не может иметь ссылку на регистр процессора, ожидания, что register
класс хранения будет удостоен чести так долго, что для стандарта нецелесообразно требовать от компиляторов требовать, чтобы вы были логичным в своем использовании.
'register' - это подсказка на C++, поэтому компилятор имеет право игнорировать его. Если вы берете его адрес, компилятор игнорирует его. –
@ Jean-BaptisteYunès Это тоже намек на C. –
, вероятно, нет современного ключевого слова для поддержки компилятора –