본문 바로가기

C언어/C언어 문법

[C언어] static 변수, register 변수

728x90
반응형

static 변수

 

지역변수에 static 선언을 추가하는 것으로 우리는 새로운 특성을 가진 변수를 만들 수 있다.

 

 

static 변수는 선언된 함수 내에서만 접근 가능한 지역변수의 특성도 갖고 있고

딱 1회 초기화되고 프로그램 종료 시까지 메모리 공간에 존재한다는 전역변수의 특성도 갖고 있다.

 

 

 

 

#include <stdio.h>

void func(int a)
{
	static int num = 0;	
	num+=a;
	printf("static : %d\n", num);
}


int main ()
{
	func(5);
	func(5);
	func(5);
	func(5);
	func(5);
	return 0;
}

 

 

 

 

따라서 위 코드에서 num의 값이 함수가 호출될 때마다 5씩 증가하는 것을 확인할 수 있다.

 

 

이때 선언부는 최초 1회밖에 적용되지 않기 때문에 num이 다시 0으로 초기화되는 일은 없다.

 

 

 

 

 

 

 

 

 

 

 

 

 

register 변수

 

register int num = 5;

 

 

지역변수에 또 한 가지 추가할 수 있는 register라는 키워드가 있다.

 

이 register라는 선언을 추가하게 되면 해당 변수는 CPU 내에 존재하는 레지스터 메모리 공간에 저장될 확률이 높아진다.

 

레지스터 메모리는 적은 용량이지만 CPU 내에 존재하기 때문에 연산속도가 매우 빠르다.

 

따라서 빈번하게 사용하는 변수의 경우에는 register선언을 통해 레지스터 변수로 만들어주는 것이 연산 속도 향상에 도움이 된다.

 

 

 

그러나 최종적인 결정을 하는 것은 컴파일러이다.

 

우리가 register 선언을 아무리 한다고해도 컴파일러가 적합하지 않다고 판단하면 해당 변수는 레지스터 메모리에 할당되지 않는다.

 

반대로 우리가 register 선언을 하지 않았더라도 컴파일러가 판단하기에 빈번한 사용이 예상된다고 한다면 레지스터 메모리에 할당된다.

 

 

전역변수의 경우에는 메모리를 항시 차지하고 있기때문에 레지스터 메모리에 넣기에는 너무 낭비가 크다.

 

따라서 전역변수에 아무리 register 키워드를 붙인다고 하더라도 컴파일러는 이를 허용하지 않을 것이다.

 

 

 

 

 

 

 

 

 

728x90
반응형