#include <iostream>
using namespace std;
void staticLocalIncrement()
{
static int num = 1;//예외 변수
cout << "num: " << num << endl;
num++;
cout << "num: " << num << endl;
}
int main()
{
staticLocalIncrement();
staticLocalIncrement();
staticLocalIncrement(); // num == 4
return 0;
}
여기서 static int num으로 선언한 변수는 함수가 끝나도 초기화가 되지 않는다.
static으로 선언한 변수는 stack에 쌓이지 않고 메모리의 다른 영역에 생성된다. 이후 해당 static 변수가 다시 호출되었을 때는 초기화가 되지 않는다.
즉, static 변수는 지역변수가 아닌 예외 변수다!
Fuction call stack
LIFO(Last in first out)
Stack Frame ( Activation Record) ****중요
스택은 유한하고, stack overflow 발생할 수 있음.
일단 메모리 구조에 대한 파악을 먼저 해보자
코드공간
static 변수, 전역변수 , string 리터럴
스택
힙
이해를 한번 해보자!
#include <iostream>
using namespace std;
int func2(int x, int y, int z)
{
x += y + z;
return x;
}
int func1(int a, int b)
{
int result;
result = a + b;
result = func2(result, a, b);
return result;
}
int main()
{
int x = 10;
int y = 20;
int z;
z = func1(x, y);
cout << z << endl;
return 0;
}
main 함수부터 시작되어 int형 변수 x, y, z 가 선언이 되고 func1(x,y)가 호출된다.
이때의 동작과정을 같이 봐보자.
이게 func1() 함수가 호출이 되기 전이고, CC의 값이 무엇인가 하고 의문을 가질 수 있다.
위의 코드를 보면 func2의 동작이 끝나고 fun1의 동작이 끝나고 main의 z에 값을 알 수 있다.
즉, 위의 func2의 return된 값이 복사되고..func1의 return 값이 복사 될때까지는 메모리에 쓰레기 값이 존재한다.
fucn1 함수가 호출된 이후의 메모리 그림이다.
이전에 말했던 것을 기억하나? call-by-value의 개념이 기억난다면 ‘아! 지금 그 개념이 들어가 있구나!’ 하고 알아채면 GOOD이다.
이제 위의 그림이 func2가 호출이 된 이후의 그림이다.
이제 이후의 x의 값은 60으로 바뀌고 자신을 호출한 지점으로 실행 흐름이 되돌아간다.
아래의 그림을 한번 보도록 하자