반응형

일반적으로 변수는 주기억 장치의 기억 영역에 해당되지만, register 지정자에 의해 선언된 레지스터 변수는 CPU의 빠른 레지스터라는 기억 영역에 배치된다. 다만, 실제로 레지스터를 사용할 것인지의 판단은 컴파일러에 맡길 수 있다.

레지스터에 저장하기

함수 내에 있는 변수가 자주 참조되는 경우가 종종 있다. 예를 들어, 그래픽 등 큰 정보를 반복 문장으로 제어하는 경우에 처리해야 픽셀의 변환에 사용되는 매개 변수를 저장하는 변수는 자주 액세스될 것이다. 이와 같이, 일정한 시간 내에 수천 수만 번 참조가 예상되는 변수는 조금이라도 빠른 메모리에 저장해야 한다 생각할 수 있다.

그래서 C 언어에는 이러한 변수를 레지스터 변수로 선언할 수 있다. 레지스터 변수는 컴퓨터의 내부에서 가장 빠른 레지스터라고 불리는 CPU의 저장 공간에 정보를 저장하는 것을 나타낸다.

보통의 변수는 주기억 장치에 저장된다. 주기억 장치는 우리가 평소 메모리라고 부르고 있는 장소로 하드 드라이브 등의 파일 저장용 보조 기억 장치에 비해서 고속으로 동작한다. 이보다 더 고속으로 동작하는 캐시 메모리도 존재하고 있지만, 이것들을 이용하는 것은 시스템으로 물리적 구조를 시스템이 은폐되어 있기 때문에 응용 프로그램은 사용할 수 없다.

그리고, 주기억 장치와 캐시 메모리 이상 빠르게 작동하는 메모리 레지스터이다. 왜냐하면 레지스터는 CPU에 포함된 메모리이기 때문이다. 주기억 장치 등의 정보를 처리할 경우, CPU가 계산을 위해 값을 가져와야 한다. 이 처리는 C 언어로 볼 수 없지만, 기계어에는 하나의 명령이 된다. 계산을 위해 메모리에서 CPU에 값을 읽거나 계산 결과를 메모리에 옮기는 처리도 CPU와 메모리의 통신 회로에 의존하는 시간이 소요될 것이다.

레지스터에 값이 저장 있다면, 이런 시간을 단축할 수있을 것으로 기대한다. 따라서 자주 사용되는 변수는 주기억이 아닌 레지스터에 저장하는 것을 권장한다. 레지스터 변수를 선언하려면 register 지정자를 지정한다.

register 지정자

register 형 변수명 ...

레지스터의 수와 레지스터의 사이즈 등은 물리적 컴퓨터에 의존하는 문제이다. 컴파일러는 register 선언을 무시하는 것이 허락되어 있으며, 레지스터에 저장이 불가능하다면 일반 변수로 처리된다. 일반적인 해석으로는 하나의 함수 내에 2개 정도의 레지스터 변수가 적당하다고 생각할 수 있다. 다만, 레지스터 변수를 과도하게 선언해도 문제는 없다.

레지스터 변수의 주의점으로는 레지스터 변수는 주기억에 배치되지 않는다는 것이 원칙이므로 주소를 요구할 수 없다.

코드3

#include <stdio.h>

int main() {
    register int i;
    register int k;

    i = 5;
    k = i * 3;

    printf("i = %d, k = %d\n" , i, k);
    return 0;
}

코드1에서는 int 형의 레지스터 변수 i와 k를 선언하고 있다. 이 변수의 값이 정말로 레지스터에 저장되는지 여부는 컴파일러에 의존하는 문제이다. 컴파일러는 register 지정자 자체를 무시할 수 있다.

최근의 컴파일러가 생성하는 코드는 최적화가 진행되고 있기 때문에, 능숙하지 않은 개발자는 register 지정자를 따로 지정할 필요는 없고, 일반 코드에도 충분히 최적화된다. 따라서 현재에는 auto 지정자와 마찬가지로 register 지정자도 거의 이용되지 않는다.

반응형

+ Recent posts