본문 바로가기
Coding&Script/C, C++,C#

전역변수/지역변수/정적변수/레지스터변수

by WeetLies 2019. 3. 20.

전역변수(Global Variable)

-프로그램 어디서든 접근 가능한 변수를 말한다.

-main함수가 실행되기전에 프로그램의 시작과 동시에 메모리에 할당된다.

-프로그램의 크키가 커질수록 전역변수로 인해 프로그램이 더 복잡해질 수 있다.

-메모리에서 데이터(Data)영역[각주:1]이 적재된다.

-예제

int a=5라고 메인 함수 호출 이전에 선언한다. 메인함수에서 선언하지 않아도 메인함수 실행전에 선언되어있기때문에, 프로그램이 시작과 동시에 메모리에 적재가 된다. 그렇기떄문에 메인함수 내에서 소스코드가 간결해진다.

-결과



지역변수(Local Variable)

- 프로그램에서 특정한 블록(Block)에서만 접근할 수 있는 변수를 말한다.

- 함수가 실행될때마다 메모리에 할당되며, 함수가 종료될때 메모리에서 해제가 된다.

- 메모리의 스택(Stack)영역에 적재된다.

- 예제

여기서 지역변수는 if문 안에 들어간 int a =5; 가된다. if라는 함수 내에서 새로이 호출된 int a는 5라는 값으로 바뀌게 되어 화면에 출력되지만, 

if문이 종료된 이후에는 기존의 a=7의 값으로 돌아가 화면에 출력되게 된다.

-결과


정적변수(Static Variable)

-특정한 블록에서만 접근할 수 있는 변수를 말한다.

-프로그램이 실행될 때 메모리에 할당되어 프로그램이 종료되면 메모리에서 해제된다.

-메모리의 데이터(Data)영역에 적재된다.

-예시

소스 코드상에서 보면 void process(){ 다음줄에 static int a=5;라고 되어있다. 

그냥 int a=5;라고 했을땐, process함수를 호출할때마다, int a를 5로 초기화 한다음 다음 라인  a=a+1;을 수행하게 되며 몇번을 호출하던지 값은 6만 반환하게 된다. 하지만 자료형int앞에 static을 붙힘으로써 프로그램을 시작했을때 초기에서만 입력된 값으로 변수를 초기화해준 이후에는 변수를 호출할때마다 변수를 초기화하지않고, 최종적으로 수정된 값을 유지하게 된다. 

-결과



레지스터변수(Register Variable)

-메인메모리에서 연산을 하는게 아닌 CPU의 레지스터를 이용해 처리하는 변수이다. 

-메인메모리에 적재한 후 연산처리를 하는게 아닌, CPU의 자원을 활용해서 처리하는 변수이기때문에 연산처리속도가 메모리를 활용하는것보단 빠르다.

-레지스터의 자원은 매우 한정적이기도하며, 없는 사용자와 있는 사용자등 사용에 대한 예외상황이 많기때문에 실제로 레지스터에서 처리될지는 장담할 수 없다. (레지스터변수를 선언해서 코드를 짰더라도, 레지스터의 공간이 부족할경우에는 그냥 메인메모리에서 연산할 수도 있다.)

-예시

레지스터영역에 int형 a는 10이라고 선언하고 i를 생성했다. 컴퓨터 마다 레지스터의 여유는 다르기때문에, 이 영역이 진짜 CPU의 레지스터를 이용해 처리되었을지, 그냥 메인메모리에서 처리되었을지는 모른다.

-결과

  1. 메모리는 크게 4가지의 공간으로 나뉘어 적재된다. 코드 영역 = 소스코드 적재 데이터 영역=전역변수/정적변수 적재 힙 영역=동적 할당변수 적재 스택 영역 = 지역변수/매개변수 적재 [본문으로]

'Coding&Script > C, C++,C#' 카테고리의 다른 글

문자/문자열[char형/%c/getchar(),gets(),gets_s(),strlen(),strcmp(),strcpy(),strcat(),strstr()]  (0) 2019.03.20
포인터  (0) 2019.03.19
배열  (0) 2019.03.19
함수/재귀함수  (0) 2019.03.19
반복문(for, while)  (0) 2019.03.18