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 = # /* 컴파일 오류 */

제약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, C++' 카테고리의 다른 글
[ C ] 메모리 이해하기5_힙(heap) 메모리란? (395) | 2020.07.15 |
---|---|
[ C ] 메모리 이해하기4 _스택(stack) 메모리란? (392) | 2020.07.15 |
[ C ] 메모리 이해하기2_레지스터(Register)란? 필요한 이유 (413) | 2020.07.13 |
[ C ] 메모리 이해하기1_메모리의 종류(스택, 힙, 레지스터?) (404) | 2020.07.12 |
[ C 언어 ] 함수 포인터란? (397) | 2020.07.07 |
댓글