Фон
Некоторые процессоры, такие как Atmel AVR, иметь регистровый файл общего назначения, который также является частью основной памяти — см. рис. 7-2 в разделе 7.4 и абзац после фигура.
О чем думала WG14?
Учитывая это, почему комитет C решил сделать
register int ri;
int* pi = &ri;
повсеместно неправильно сформирован, согласно сноске 101 к N1124 а> раздел 6.7.1? Не будет ли неопределенное или определяемое реализацией поведение более разумным, учитывая, что приведенный выше код имеет смысл по крайней мере на одном процессоре, а C изгибается назад, чтобы приспособиться к гораздо более странным (и более редким!) целям, чем AVR?
101) Реализация может рассматривать любое объявление
register
просто как объявлениеauto
. Однако независимо от того, используется ли на самом деле адресуемое хранилище, адрес любой части объекта, объявленного с помощью спецификатора класса храненияregister
, не может быть вычислен ни явно (путем использования унарного оператора&
, как обсуждалось в 6.5.3.2), ни неявно ( путем преобразования имени массива в указатель, как обсуждалось в 6.3.2.1). Таким образом, единственный оператор, который можно применить к массиву, объявленному со спецификатором класса храненияregister
, — этоsizeof
.
Я просто изменил регистр ЦП через указатель. Wat?!
Кроме того, используя расширение явных регистровых переменных GCC, можно указать компилятору поместить переменную в определенный регистр. В этом случае вы можете получить указатель с псевдонимом регистровой переменной, как показано ниже:
register int ri asm("r15") = 0;
int* pi = (int*)0x15;
/* pi now aliases ri */
*pi = 42;
/* ri is 42 now */
assert(ri == 42);
Как GCC поступает в таком случае? Мне кажется поистине странным, что что-то подобное не рассматривалось... или рассматривалось?
pi
будет установлен на адрес памяти регистра — на AVR это то же самое, что и номер регистра. Что касается его использования? Одной из возможностей было бы сохранить важную переменную для быстрого доступа в сложном внутреннем цикле, но при этом позволить подпрограммам этого внутреннего цикла изменять ее (как если бы она была закрыта). - person LThode   schedule 13.11.2014