Я прочитал, что gcc предоставляет поддержку для определения глобальных переменных в качестве хранимых переменных регистра. Я хочу знать, что стандарты имеют какие-либо спецификации для этой поддержки.Значения языков языка C указывают поддержку глобальных переменных регистра
ответ
Нет. В стандартах не указаны какие-либо функции. Класс хранения register
ведет себя как auto
и не может использоваться для глобальных переменных.
Как правило, все, что присуще определенной машине не является частью стандарта C.
в первую очередь. выделение «регистр хранимых переменных», если они есть, являются заданием компилятора. C
standard ничего не оговаривает обязательно примерно такой же.
Это говорит,
глобальная переменная не может быть определена с
register
классом хранения, согласноC11
, глава §6.9В хранилище класса спецификаторы
auto
иregister
не должны появляются во спецификаторах объявления во внешней декларации.register
Использование не гарантирует выделение в реестре, Глава §6.7.1 (курсив мой)декларация идентификатора для объекта с хранением класса спецификатор
register
предлагает, чтобы доступ к объекту был как можно быстрее. Степень, в которой такие предложения эффективны, определяется реализацией.
Интересно, почему стандарт запретил использование классификатора регистров с глобальными переменными, поскольку такая вещь могла бы улучшить оптимизация даже без глобального распределения регистров. С учетом 'extern int foo; extern int * bar; 'код' foo ++; * bar^= 1; Foo ++; * bar^= 2; 'должен выполнить все четыре шага по порядку. Если 'foo' может быть зарегистрирован в регистре, операции могут быть переупорядочены как' foo + = 2; * Бар = 3; '. – supercat
register
не могут быть использованы для глобальных переменных. Это покрыто С11 6,9/2:
сдерживающих
В хранилище класса спецификаторы
auto
иregister
не должны появляться в декларации спецификаторов во внешней декларации.
Здесь внешняя декларация означает любое объявление, которое не входит в функцию. (Не путать с extern
или внешним соединением).
Global register variables не поддерживаются и не допускаются стандартами C99 или C11 (см. Ответы Sourav Ghosh's или Matt McNabb's).
Как расширение, GCC принимает
register int *foo asm ("a5");
объявить глобальнойint
переменной сидя в регистре a5
... Это очень редко бывает полезна, и вы должны понять, как GCC генерирует код и выделяет registesr, каковы вызывающие соглашения вашего ABI, ... чтобы иметь возможность использовать это без страхов ... Кстати, это, вероятно, ослабит возможности оптимизации GCC.
Но это GCC конкретных, Clang/LLVM делает not поддержку, расширение, даже если он поддерживает несколько других расширений GCC (например, вычисленный goto
-s, ...).
В ARM, если программа, которая нуждается в небольшом количестве глобальных переменных, которые используются * lot *, помещая все такие переменные в структуру и выделяя регистр для хранения их адреса, избавит от необходимости загружать индексный регистр при доступе любой из этих переменных. По-видимому, это не распространено на более крупных встроенных системах, но иногда очень полезно для небольших. – supercat
Существует общее мнение о том, что ключевое слово C register
говорит об аппаратных регистрах. Это может быть источником этой концепции, но в современном C это не цель. Единственный реальный эффект, который имеет register
, заключается в том, что &
не допускается к такому зверю.
Они могут быть реализованы любым способом, который компилятор хочет, аппаратные регистры, инструкция немедленно или в стеке, вы не знаете. То, что вы знаете, состоит в том, что переменная register
не может иметь псевдоним с другими переменными.
И для более точного ответа на ваш вопрос нет register
в области файлов не является частью языка C. Если бы это было так, это позволило бы объявить register const
переменные почти любой базы, которые могли бы служить как-то вроде global constants.
Регистрация аппаратного реестра для конкретных переменных - это расширение, которое предоставляют компиляторы, например gcc. Функция Gcc, как расширение, также работает в области файлов. Но это довольно непомерно, так как обычно у процессоров не так много аппаратных регистраторов.
Возможно, вы захотите [прочитать это] (http://stackoverflow.com/a/315035/314291) – StuartLC