Почему мы не можем всегда использовать класс хранения регистров в C?

Я читал в книге, что всякий раз, когда мы объявляем переменную с классом хранения в качестве регистра, она сохраняется в регистре, в зависимости от ее доступности. Если регистр недоступен, ему будет назначен тип хранилища по умолчанию «auto».

Всякий раз, когда мы объявляем переменную без явного упоминания какого-либо класса хранилища, назначенный ей тип хранилища по умолчанию — сам «auto».

Итак, мой вопрос, почему бы не объявить каждую переменную классом хранения ‘register’ — если регистр недоступен, он в любом случае будет рассматриваться как сам класс по умолчанию ‘auto’. И, к счастью, если регистры доступны, то они будут храниться в одном. Я понимаю, что мы не можем использовать & оператор больше, но что если я не собираетесь работать с указателями и адресами? Могу ли я объявить эти переменные с классом хранения ‘register’? Потому что это плохая практика.

Редактировать: я искал в Интернете, но «недоступность адреса» является единственным упомянутым пунктом. Почему остальные переменные не могут быть объявлены с помощью ‘register’, не упоминается.

3

Решение

Вы не можете сделать все свои переменные register,
потому что спецификация (и) языка C (и (C ++) явно запрещает брать адрес register переменная.

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

С точки зрения оптимизации, современные компиляторы обрабатывают auto а также register квалифицированные переменные таким же образом (следовательно, register квалификатор бесполезен, кроме как запретить адрес оператора).

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

AFAIK, будущие версии языков C и C ++ официально объявят устаревшим register квалификатор (как они сделали для auto квалификатор), и может случиться так, что будущие спецификации языка будут использовать это ключевое слово для других целей (как C ++ 11 повторно auto). Так с помощью register в твоем исходнике наверное ошибка, поскольку это может затруднить перенос вашего кода на будущие версии C или C ++.

6

Другие решения

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

Любой современный компилятор в любом случае будет использовать регистры в максимально возможной степени, поэтому это ключевое слово больше не нужно. Компилятор также умнее вас: он может использовать регистр для переменной x в одной части и для переменной y в другой части программы. Или используйте регистры для двух из пяти полей структуры. Все, что вы даже не можете выразить с помощью ключевого слова register.

Единственный случай, когда использование регистра может быть не совсем бессмысленным, это когда у вас есть переменная, которая выглядит так, как будто она используется гораздо реже, чем другие, но вы знаете лучше. Уже тогда это очень большое «майское».

3

По вопросам рекламы [email protected]