본문 바로가기

C언어 자습/혼자공부하는 C언어 (저자 서현우)

정적 지역 변수static, 레지스터 변수register

지역 변수 선언시 static 예약어를 사용하여 정적 지역변수를 만든다.

 

함수가 반환값을 반환하고 호출이 종료된 후에도 static변수는 메모리 저장공간을 계속 유지한다.

#include<stdio.h>
#include<string.h>

void auto_func(void);
void static_func(void);
int main()
{
	int i;
	printf("일반 지역 변수(auto)를 사용한 함수...\n");
	for (i = 0; i < 3; i++)
	{
		auto_func();
	}

	printf("정적 지역 변수 (static)을 사용한 함수...\n");
	for (i = 0; i < 3; i++)
	{
		static_func();
	}
	return 0;
}


void auto_func(void)
{
	auto int a = 0;	//그냥 지역 변수 선언

	a++;
	printf("%d\n", a);
}

void static_func(void)
{
	static int a;	//static 예약어를 사용하여 지역변수 선언

	a++;
	printf("%d\n", a);
}

 

 

레지스터 변수

레지스터 변수는 register 예약어를 사용한다.

자주 사용하는 변수, 반복문 등에서 연산량이 매우 많은 변수는 레지스터로 선언하면

메인 메모리가 아닌 레지스터에 변수를 저장한다.

한마디로 많이 쓰는 녀석을 레지스터로 선언 하면 효율성이 좋아진다는 것입니다.

#include<stdio.h>
#include<string.h>

int main()
{
	register int i;
	auto int sum = 0;
	for (i = 1; i <= 10000; i++)	//연산량 10000회
	{
		sum += i;	//반복문 안에서도 사용됨
	}

	printf("%d\n", sum);

	return 0;
}

레지스터 변수 사용시 주의점이 있습니다.

 

전역 변수는 레지스터 변수로 선언할 수 없다.

  • 레지스터 변수는 잠깐 출력을 증폭시켜 사용하는 부스터와 같다.
  • 이를 전역 변수에 사용하면 프로그램 실행 내내 사용되기 때문에 사용 의도와 맞지 않다.(오히려 성능 저하될 수 있음)

레지스터 변수는 주소를 구할 수 없다.

메인 메모리가 아닌 레지스터에 변수가 생성되기 때문에 &를 써서 주소를 구할 수 없다.

레지스터의 사용 여부는 컴파일러가 결정한다.

레지스터는 CPU가 사용하는 비싸고 중요한 저장공간이다. 때문에 컴파일러가 효율적이지 않다고 판단하면 register 예약어를 사용하더라도 메인 메모리에 변수를 생성하기도 한다.