Почему переменные регистра не могут быть глобальными? - PullRequest
4 голосов
/ 15 августа 2010

При чтении с сайта читается, что нельзя создать глобальную переменную типа register. Почему так? источник: http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=/com.ibm.xlcpp8l.doc/language/ref/regdef.htm

Ответы [ 9 ]

20 голосов
/ 15 августа 2010

В теории вы можете выделить регистр процессора для глобальной переменной области видимости - этот регистр просто должен оставаться выделенным для этой переменной в течение всего срока службы программы.

Однако компиляторы C, как правило, не видят всю программу на этапе компиляции - стандарт C был написан так, что каждая единица перевода (примерно соответствует каждому .c файлу) может быть компилируется независимо от других (с скомпилированными объектами, позже связанными в программе). Вот почему глобальные переменные регистра области видимости не допускаются - когда компилятор компилирует b.c, он не может знать, что глобальная переменная была присвоена регистру в a.c (и, следовательно, функционирует в b.c должен сохранить значение в этом регистре).

10 голосов
/ 15 августа 2010

На самом деле, GCC позволяет это.Объявление в глобальной области видимости:

register int foo asm ("r12");

Выделяет регистр "r12" (для x86_64) для глобального "foo".Это имеет ряд ограничений, и соответствующая страница справочника, вероятно, является лучшей ссылкой на все переменные глобального регистра проблем, которые могут возникнуть:

5 голосов
/ 15 августа 2010

Потому что это было бы бессмысленно. Глобальные переменные существуют все время, пока приложение работает. Там, конечно, нет свободного регистра процессора в течение столь длительного времени;)

2 голосов
/ 15 августа 2010

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

Операнд унарного оператора & должен быть либообозначение функции, результат оператора [] или унарного * или lvalue, который обозначает объект, который не является битовым полем и не объявлен со спецификатором класса хранения регистра

реализует ограничение на автоматические переменные (те, которые вы объявляете в функции), так что ошибочно брать адрес такой переменной.Таким образом, идея заключается в том, что компилятор может представлять эту переменную любым удобным для нее способом - регистром или непосредственным значением ассемблера и т. Д. Вы, как программист, обещаете, что не будете использовать ее адрес.Обычно это не имеет большого смысла для глобальных переменных (в любом случае они имеют адрес).

Подводя итог:

  • Нет, ключевое слово register не игнорируется.
  • Да, он может использоваться только для переменных стека, если вы хотите быть стандартным конформном
2 голосов
/ 15 августа 2010

Изначально переменные регистра предназначались для хранения в регистрах процессора, но глобальные переменные должны храниться в данных или разделе BSS, чтобы быть доступными для каждой функции. Сегодня компиляторы не интерпретируют класс хранения register строго, поэтому он остается в значительной степени из соображений совместимости.

1 голос
/ 15 августа 2010

Слово регистр используется в C / C ++ как запрос к компилятору для использования регистров переменных типа процессора.Регистр - это своего рода переменная, используемая процессором, очень быстро доступная, потому что она не находится в памяти (RAM).Использование регистра ограничено архитектурой и размером самого регистра (это означает, что некоторые из них могут быть похожи на указатели памяти, другие могут загружать специальные значения отладки и т. Д.).

Соглашения о вызовах, используемые C / C ++, не используют общие регистры (EAX, EBX и т. Д. В Arch 80x86) для сохранения параметров (но возвращаемое значение сохраняется в EAX), поэтому вы можете объявитьvar, как регистр, ускоряет создание кода.

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

0 голосов
/ 01 октября 2010

Итак, все ли мы сейчас согласны?Все ли мы видим, что превращение глобальной переменной в регистровую переменную было бы действительно очень плохой идеей?Если оригинальное определение C не запрещало это, то, возможно, это было потому, что никто не думал, что кто-то на самом деле реализует его таким образом - как это не должно было быть особенно в дни CISC.работа по решению, когда хранить переменные в регистрах, чем люди могут сделать.Если ваш не может этого сделать, то вам действительно ДЕЙСТВИТЕЛЬНО нужно найти лучший компилятор.

0 голосов
/ 15 августа 2010

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

Такой подход хорош для локальных переменных регистра, но бесполезен для глобальных. Чтобы глобальные переменные регистра были полезны, программист должен, как правило, сообщать компилятору, какой регистр должен использоваться для какой переменной, и убедиться, что такие резервирования известны компилятору при компиляции всех модулей - даже тех, которые не используют зарегистрируйтесь иначе. Это может быть полезно во встроенных системах, особенно с переменными, которые используются прерываниями, но обычно в системе допускается очень ограниченное количество (например, около 2) таких переменных.

0 голосов
/ 15 августа 2010

Потому что они в регистрах. Это противоречие в терминах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...