본문 바로가기
컴퓨터 공학/C, C++

[ C ] 메모리 이해하기3 _register 키워드란? register 변수의 제약

by hahehohoo 2020. 7. 14.
반응형

 

register 키워드란? register 변수의 제약

 

 

■ register란?

프로그래머가 레지스터를 직접 사용하려면 어셈블리어로 코딩하면 됩니다. 물론 C언어도 가능하지만 레지스터 사용을 '요청'만 하기 때문에 실제로 그 명령이 레지스터로 갈 지, 스택 메모리로 갈 지는 컴파일러 마음입니다. 진짜 레지스터로 갔는지 확인하려면 어셈블러를 보면됩니다. 

 

데이터를 레지스터에 저장한다고 할 때 register 키워드를 사용하면 됩니다. 이런 키워드를 저장 유형 지정자(storage-class specifier)라고 하는데 데이터를 어떻제 저장해야 하냐를 알려주는 키워드입니다. register 선언 방법은 아래와 같습니다.

register < 자료형 > <변수형>;

int num;
register size_t i; // '이 변수는 가능하면 레지스터로 넣어줘.' 라고 요청한 상태 

num = 0;

for (i=0; i<1000; ++i)
{
    num += i;
}

printf("num: %d\n", num);

 


■ register 변수의 제약

레지스터는 메모리가 아니라서 레지스터 변수는 몇 가지 제약들이 있습니다.

 

제약 1: 변수의 주소를 구할 수 없음

레지스터가 될 수도 있기 때문에 주소를 구할 수 없다. C표준에서 레지스터의 메모리 접근을 금지하기 때문입니다. 

 

register int num = 10;
int* p;

p = &num; /* 컴파일 오류 */

 

컴파일 오류

 

 

제약2: 레지스터 배열을 포인터로 사용불가

register int nums[10];
int* p;

p = nums; /* 컴파일 오류 */
p = &nums[0]; /* 컴파일 오류 */

 

컴파일 오류

 

 

 

제약 3: 블록 범위에서만 사용 가능

전역 변수로는 사용할 수 없습니다.

#include <studio.h>

register int g_num; /* 컴파일 오류 */
 
int main(void)
{
   return 0;
}

컴파일 오류

 

 

 

최신 컴파일러는 register 키워드 무시합니다. 그럼에도 아직 언급되는 이유는 과거에 만들어진 임베디드 시스템에서는 의미가 있었기 때문입니다. 예전에는 CPU도 매우 느렸고, 메모리 용량도 적었습니다. 또한 최적화를 잘 해주지 않는 컴파일러 때문에 프로그래머가 레지스터 사용에 대해 직접 명령해야 했습니다. 

 

 

 

-----------------------------------

C언어 문법 총정리

목록 보러가기 

-----------------------------------

 

반응형


댓글