Как правило, компиляторы CPP (g++) вносят немало оптимизаций в код. Поэтому, когда вы объявляете регистровую переменную, компилятору не обязательно сохранять это значение непосредственно в регистре. (т. е.) код «register int x» может не привести к тому, что компилятор сохранит этот int непосредственно в регистре. Но если мы сможем заставить компилятор сделать это, мы можем добиться успеха.
Например, если мы используем следующий фрагмент кода, мы можем заставить компилятор делать то, что нам нужно. Компиляция следующего фрагмента кода может привести к ошибке, что указывает на то, что int на самом деле сохраняется непосредственно в регистре.
int main() {
volatile register int x asm ("eax");
int y = *(&x);
return 0;
}
Для меня компилятор g++ в этом случае выдает следующую ошибку.
[nsidde@nsidde-lnx cpp]$ g++ register_vars.cpp
register_vars.cpp: In function ‘int main()’:
register_vars.cpp:3: error: address of explicit register variable ‘x’ requested
Строка «изменчивый регистр int x asm («eax»)» указывает компилятору хранить целое число x в регистре «eax» и при этом не выполнять никаких оптимизаций. Это гарантирует, что значение будет сохранено непосредственно в регистре. Вот почему обращение к адресу переменной вызывает ошибку.
Кроме того, компилятор C (gcc) может выдать ошибку со следующим кодом.
int main() {
register int a=10;
int c = *(&a);
return 0;
}
Для меня компилятор gcc в этом случае выдает следующую ошибку.
[nsidde@nsidde-lnx cpp]$ gcc register.c
register.c: In function ‘main’:
register.c:5: error: address of register variable ‘a’ requested
person
Nagakishore Sidde
schedule
04.08.2014
register
запрещает использование ее адреса там. (Это не более чем подсказка относительно помещения переменной в регистр.) - person Daniel Fischer   schedule 09.04.2013