일반적으로 CPP 컴파일러 (g ++)는 코드를 상당히 최적화합니다. 따라서 레지스터 변수를 선언 할 때 컴파일러가 해당 값을 레지스터에 직접 저장할 필요는 없습니다. (즉) 'register int x'코드가 컴파일러에서 해당 int를 레지스터에 직접 저장하지 못할 수 있습니다. 그러나 컴파일러에게 그렇게하도록 강제 할 수 있다면 성공할 수 있습니다.
예를 들어 다음 코드를 사용하면 컴파일러가 원하는 것을 수행 할 수 있습니다. 다음 코드 조각을 컴파일하면 오류가 발생하여 int가 실제로 레지스터에 직접 저장되고 있음을 나타낼 수 있습니다.
int main() {
volatile register int x asm ("eax");
int y = *(&x);
return 0;
}
이 경우 g ++ 컴파일러에서 다음과 같은 오류가 발생합니다.
[[email protected] 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")는'EAX '의 정수 X를 저장, 컴파일러를 지시 레지스터 및 최적화를하지 않도록하고있다. 이렇게하면 값이 레지스터에 직접 저장됩니다. 그래서 변수의 주소에 액세스하면 오류가 발생합니다.
또는 C 컴파일러 (gcc)는 다음 코드 자체에서 오류가 발생할 수 있습니다.
int main() {
register int a=10;
int c = *(&a);
return 0;
}
나를 위해 gcc 컴파일러는이 경우 다음과 같은 오류가 발생합니다.
[[email protected] cpp]$ gcc register.c
register.c: In function ‘main’:
register.c:5: error: address of register variable ‘a’ requested
C 및 C++은 프로그램이 실행중인 하드웨어에 "레지스터"가 있다고 보증하지 않습니다. 이것은 컴파일러에게 힌트 일뿐입니다. –
왜 신경 썼습니까? – delnan
@StephenCanon C 언어의 힌트가 아닐 뿐이지 만 변수를 선언하면 register가 그 주소를 사용하지 못하게합니다. (레지스터에 실제로 변수를 배치하는 것과 관련하여 힌트가 아닐 수도 있습니다.) –