지역변수에 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 |