C의 register 키워드

Waqar Aslam 2023년10월12일
  1. C 프로그래밍 언어의 register 키워드 개요
  2. C에서 Register 키워드 사용
  3. C에서 register 변수의 주소 얻기
  4. C에서 포인터 변수와 함께 register 키워드 사용
  5. C에서 register 키워드를 사용한 스토리지 클래스 사용
  6. C 프로그래밍 언어에서 register 변수의 범위
C의 register 키워드

이 기사에서는 C 프로그래밍 언어의 register 키워드에 대해 설명합니다.

C 프로그래밍 언어의 register 키워드 개요

C 프로그램의 모든 변수는 각각 메모리 주소와 함께 메모리에 저장됩니다. 그러나 변수와 함께 register 키워드를 사용하는 경우 컴파일러는 메모리가 아닌 CPU 레지스터에 저장할 가능성이 높습니다.

프로세서에는 한정된 수의 범용 레지스터가 있으며, 데이터에 대한 산술 또는 논리 연산을 수행하기 전에 모든 변수를 각 레지스터에 로드하는 것은 중앙 처리 장치(CPU)의 책임입니다.

레지스터는 메모리보다 훨씬 빠르므로 CPU의 액세스 타이머는 그에 따라 짧아집니다.

결과적으로 우리는 register 키워드를 프로그램 전체에서 발생 빈도가 가장 높은 변수와 짝을 이룹니다. register 키워드는 해당 변수가 프로세서 register에 저장되어야 가능한 한 최단 시간 내에 검색될 수 있도록 컴파일러에 알려줍니다.

그러나 이 변수를 메모리 또는 프로세서 register에 저장할지 여부는 컴파일러가 결정합니다.

프로그램에서 register 키워드를 사용할 수 있는 여러 시나리오를 살펴보겠습니다.

C에서 Register 키워드 사용

다음은 C 프로그래밍 언어에서 사용되는 register 키워드의 간단한 예입니다.

#include <stdio.h>

int main() {
  register char a = 'S';
  register double b = 10;
  register int c = 8;
  printf("The value of register variable a: %c\n", a);
  printf("The value of register variable b: %f\n", b);
  printf("The value of register variable c: %d", c);
  return 0;
}

출력:

The value of register variable a: S
The value of register variable b: 10.000000
The value of register variable c: 8

C에서 register 변수의 주소 얻기

변수와 함께 register 키워드를 배치한다고 가정합니다. 이 경우 컴파일러가 변수를 CPU register가 아닌 메모리에 저장하기로 결정하더라도 단항 주소 연산자 &를 사용하여 변수의 주소에 액세스할 수 없습니다.

이것은 명심해야 할 중요한 사실입니다.

주소 연산자 &를 register 변수와 결합하면 사용 중인 컴파일러에서 경고 또는 오류를 표시합니다. 받는 메시지는 메시지가 무엇인지에 따라 달라집니다.

변수와 함께 register 키워드를 사용하면 변수 값이 메모리가 아닌 프로세서 register에 배치될 수 있고 프로세서 register에는 주소가 없기 때문입니다. 예를 들어 보겠습니다.

#include <stdio.h>
int main() {
  register int registerVariable = 22;
  int* ptr = &registerVariable;
  printf("%d", *ptr);
  return 0;
}

출력:

main.c: In function ‘main’:
main.c:5:5: error: address of register variable ‘registerVariable’ requested
    5 |     int* ptr = &registerVariable;
      |     ^~~

C에서 포인터 변수와 함께 register 키워드 사용

register 키워드는 포인터와 함께 사용할 수 있습니다. 메모리 위치의 주소를 가질 수 있습니다.

다음은 C 프로그래밍 언어에서 포인터 변수와 함께 사용되는 register 키워드의 예입니다.

#include <stdio.h>

int main() {
  int value = 15;
  register int* pointerVariable = &value;
  printf("The value of the pointer is: %d", *pointerVariable);
  return 0;
}

출력:

The value of the pointer is: 15

C에서 register 키워드를 사용한 스토리지 클래스 사용

C 프로그래밍 언어는 단일 변수에 대해 다양한 스토리지 클래스 지정자를 사용하는 것을 허용하지 않습니다. register는 스토리지 클래스입니다.

따라서 register를 static, autoextern과 조합하여 사용할 수 없습니다.

#include <stdio.h>

int main() {
  auto register int value = 15;
  printf("The value of the pointer is: %d", value);
  return 0;
}

출력:

main.c: In function ‘main’:
main.c:5:5: error: multiple storage classes in declaration specifiers
    5 |     auto register int value = 15;
      |     ^~~~

C 프로그래밍 언어에서 register 변수의 범위

로컬 변수와 함께 register 키워드를 사용하는 것만 가능합니다. 전역 범위를 가진 변수와 함께 register를 사용할 수 없습니다.

#include <stdio.h>

register int value = 22;
int main() {
  printf("%d", value);
  return 0;
}

출력:

main.c:3:14: error: register name not specified for ‘value’
    3 | register int value = 22;
      |
작가: Waqar Aslam
Waqar Aslam avatar Waqar Aslam avatar

I am Waqar having 5+ years of software engineering experience. I have been in the industry as a javascript web and mobile developer for 3 years working with multiple frameworks such as nodejs, react js, react native, Ionic, and angular js. After which I Switched to flutter mobile development. I have 2 years of experience building android and ios apps with flutter. For the backend, I have experience with rest APIs, Aws, and firebase. I have also written articles related to problem-solving and best practices in C, C++, Javascript, C#, and power shell.

LinkedIn