본문 바로가기

c&c++

static 선언을 추가한 지역변수 (+register변수)

지역변수에 static선언을 추가하면 static변수가 된다.

 

지역변수 지역변수의 static 선언
선언된 함수 내에서만 접근이 가능하다
해당 함수가 반환하면 메모리에서 소멸된다 딱 1회 초기화되고 프로그램 종료 시까지 메모리에 존재한다

 

#include <stdio.h>

void SimpleFunc(void)
{
static int num1 = 0;                        // 딱 1회 초기화, 프로그램 종료 시까지 메모리에 존재.

                                                     -> 저장된 값이 남아 다음 호출 시에, 미리 저장된 값에 계속하여 연산된다.

                                                     -> 사실은 여기 존재하는 것이 아니라 전역변수로서 존재하는데,

                                                         접근 범위를 SimpleFunc함수 내로 제한하기 위해

                                                         static을 붙여 여기에 써 놓은 것이다


int num2 = 0;                                 // 얘는 함수가 반환 값을 넘겨주면 메모리에서 사라진다.
                                                     -> 초기화된 값으로 연산이 시작된다.
num1++; 
        num2++;

printf("static: %d, local: %d \n", num1, num2);
}

int main(void)
{
int i = 0;

for(i = 0; i < 3; i++)
SimpleFunc();

return 0;
}

 

정리하면, static으로 선언된 지역변수는 전역변수와 동일한 시기에 할당되고 소멸된다.

 

 

 

 


+ register변수

 

요건 말그대로 register에 저장되는 변수로, 성능향샹에 도움을 줄 수 있다.

그러나 레지스터는 CPU내에 존재하는, 크기가 매우 작은 메모리이기 때문에

레지스터 변수의 내용이 반드시 레지스터에 할당되는 것은 아니다.

 

단지 컴파일러가, 우리가 쓴 register 선언을 통해 레스터의 활용여부를 결정하는 데 힌트를 주는 역할을 하는 것이

register선언이라고 이해하면 편하다.

 

아무튼 결국 레지스터에 할당을 할지말지는 컴파일러가 판단한다는 말이다.

 

참고로 register선언은 전역변수에 한하여 가능하고, 전역변수에 천날만날을 선언해봐야 컴파일러는 잡소리로 본다.

'c&c++' 카테고리의 다른 글

[도전! 프로그래밍 1] 문제7번  (0) 2021.10.01
재귀함수의 개념  (0) 2021.09.30
전역변수 vs. 지역변수  (0) 2021.09.30
break는 '반복문'을 탈출한다  (0) 2021.09.26
strcmp함수 구현해보기  (0) 2021.09.15