2

Я прочитал, что gcc предоставляет поддержку для определения глобальных переменных в качестве хранимых переменных регистра. Я хочу знать, что стандарты имеют какие-либо спецификации для этой поддержки.Значения языков языка C указывают поддержку глобальных переменных регистра

+2

Возможно, вы захотите [прочитать это] (http://stackoverflow.com/a/315035/314291) – StuartLC

ответ

1

Нет. В стандартах не указаны какие-либо функции. Класс хранения register ведет себя как auto и не может использоваться для глобальных переменных.

Как правило, все, что присуще определенной машине не является частью стандарта C.

1

в первую очередь. выделение «регистр хранимых переменных», если они есть, являются заданием компилятора. C standard ничего не оговаривает обязательно примерно такой же.

Это говорит,

  • глобальная переменная не может быть определена с register классом хранения, согласно C11, глава §6.9

    В хранилище класса спецификаторы auto и register не должны появляются во спецификаторах объявления во внешней декларации.

  • register Использование не гарантирует выделение в реестре, Глава §6.7.1 (курсив мой)

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

+0

Интересно, почему стандарт запретил использование классификатора регистров с глобальными переменными, поскольку такая вещь могла бы улучшить оптимизация даже без глобального распределения регистров. С учетом 'extern int foo; extern int * bar; 'код' foo ++; * bar^= 1; Foo ++; * bar^= 2; 'должен выполнить все четыре шага по порядку. Если 'foo' может быть зарегистрирован в регистре, операции могут быть переупорядочены как' foo + = 2; * Бар = 3; '. – supercat

3

register не могут быть использованы для глобальных переменных. Это покрыто С11 6,9/2:

сдерживающих

В хранилище класса спецификаторы auto и register не должны появляться в декларации спецификаторов во внешней декларации.

Здесь внешняя декларация означает любое объявление, которое не входит в функцию. (Не путать с extern или внешним соединением).

1

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, ...).

+0

В ARM, если программа, которая нуждается в небольшом количестве глобальных переменных, которые используются * lot *, помещая все такие переменные в структуру и выделяя регистр для хранения их адреса, избавит от необходимости загружать индексный регистр при доступе любой из этих переменных. По-видимому, это не распространено на более крупных встроенных системах, но иногда очень полезно для небольших. – supercat

5

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

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

И для более точного ответа на ваш вопрос нет register в области файлов не является частью языка C. Если бы это было так, это позволило бы объявить register const переменные почти любой базы, которые могли бы служить как-то вроде global constants.

Регистрация аппаратного реестра для конкретных переменных - это расширение, которое предоставляют компиляторы, например gcc. Функция Gcc, как расширение, также работает в области файлов. Но это довольно непомерно, так как обычно у процессоров не так много аппаратных регистраторов.