register 키워드는 컴파일러에게 해당 변수를 메모리가 아닌 CPU 레지스터에 저장하도록 지시하는 역할을 합니다. 자주 접근하는 변수를 레지스터에 두면 메모리보다 훨씬 빠른 속도로 값을 읽고 쓸 수 있습니다. 다만 레지스터 변수는 메모리상의 주소를 갖지 않기 때문에 주소 연산자(&)로 그 주소를 구할 수 없다는 점에 유의해야 합니다.
register 변수의 주요 특징
- 범위(Scope) – 변수가 선언된 함수 내부에서만 유효한 지역 변수입니다.
- 기본값(Default Value) – 별도로 초기화하지 않으면 예측할 수 없는 쓰레기 값(garbage value)이 저장됩니다.
- 수명(Lifetime) – 변수가 정의된 블록의 실행이 종료될 때까지 유지됩니다.
예제 1: 기본적인 register 변수
다음은 C 언어에서 register 변수를 선언하고 사용하는 간단한 예제입니다.
#include <stdio.h>
int main() {
register char x = 'S';
register int a = 10;
auto int b = 8;
printf("레지스터 변수 x의 값 : %c\n", x);
printf("auto 변수와 register 변수의 합 : %d", (a + b));
return 0;
}
실행 결과
레지스터 변수 x의 값 : S auto 변수와 register 변수의 합 : 18
포인터와 함께 사용하기
register 키워드는 포인터 변수에도 사용할 수 있습니다. 이 경우 포인터 변수 자체가 레지스터에 저장되며, 포인터가 일반 메모리 위치의 주소값을 담는 것은 전혀 문제가 되지 않습니다. 단, 레지스터 변수 자체에는 주소가 존재하지 않으므로 register 변수의 주소를 구하려고 하면 컴파일 오류가 발생한다는 점을 기억해야 합니다.
예제 2: register 포인터
#include <stdio.h>
int main() {
int i = 10;
register int *a = &i;
printf("포인터가 가리키는 값 : %d", *a);
getchar();
return 0;
}
실행 결과
포인터가 가리키는 값 : 10
추가로 알아두면 좋은 점
현대의 최적화 컴파일러는 변수의 배치를 스스로 판단하는 경우가 많아, register 키워드를 단순한 힌트로만 취급하거나 무시하기도 합니다. 따라서 register를 사용한다고 해서 반드시 성능이 향상되는 것은 아니며, 자주 사용되는 소규모 변수(루프 카운터 등)에 적용하는 것이 일반적입니다. 또한 register 변수에는 주소 연산자(&)를 적용할 수 없으므로, 해당 변수의 주소가 필요한 코드에서는 사용하지 않는 것이 좋습니다.