'변수의 메모리 할당 과정'에 해당되는 글 1건

  1. 2009.05.02 scope와 메모리 할당과정


참고) actionscript나 java등에는 함수에 직접 scope를  설정한다.
따라서 이 부분은 C의 설명이지만 scope의 개념이 중요하다.
예) private function aaa():void
{

}

* 변수의 범위(scope)
  - 지역변수(local)
    : 중괄호 내에 선언되는 변수
    : 함수가 호출될때 메모리에 선언되지만 함수가 종료되면 메모리에서 삭제 된다.
   예) int main()   
    {
     main의 함수 지역 안에 선언된 변수
     해당 함수안에서만 접근가능
     int a=10;
     return a;
     함수종료후 변수 a는 메모리에서 삭제
    }

  - 전역변수(Global)
   : 함수내에 선언되지 않는 변수
   예) int b=10;
    int main()   
    {
     변수 b는 어떤 함수에서도 접근이 가능한 전역 변수가 된다.
     int a=10;
    }

  - 정적 변수(static)
   : 함수내부,외부에 모두 선언 가능

  - 레지스터 변수(Register)
   : 선언에 제한이 많이 따름

 * 변수의 메모리 할당 과정 

  예)                                                        메모리
   int fct_one(void)                        과정1 |  undefined  |
   {                                                      |  undefined  |
    int one=10;                                       |  undefined  | 
    return 0;                                           |   val = 10  | main함수의 val이 메모리에 할당된다.
   }

   int fct_two(void)                         과정2 |  undefined  |
   {                                                      |  undefined  |
    int two=20;                                        |   one = 10  | 아직 main은 실행중이고 main에서 호출한다
    int three=30;                                      |   val = 10  | fct_one함수에 의해 변수 one이 할당된다.
    return 0;            
   }                                              과정3 |  undefined  |
                                                           |  three = 30 |
   int main(void)                                     |   two = 20  | fct_one함수는 종료되어 변수 one은 메모리에서 삭제
   {                                                      |   val = 10  | fct_two함수에 의해 two과 three가 메모리에 할당된다.
    int val=10; -> 과정 1
    fct_one();  -> 과정 2                과정4   |  undefined  |
    fct_two();  -> 과정 3                           |  undefined  |
    return 0;   -> 과정 4                            |  undefined  | fct_two가 종료되어 two과 three가 메모리에서 삭제
   }                                                       |  undefined  | main함수가 종료되어 val가 삭제


 * 다른 형태의 지역변수:for문이나while문 등에서 사용하는 변수
  - while,for,if문과 같은 문장에서 형성되는 지역 내에 선언되는 변수 : 플래시에서는 이와 상관없이 함수안에서 접근 가능


 * 지역 변수와 매개 변수
  - 매개변수도 지역 변수의 일종이다.


 * 전역변수(전체영역에서 접근가능 변수)
  - 프로그램 어디에서나 접근이 가능한 변수
  - 특정영역(함수,반복문..)에 속하지 않는다.
  - 프로그램이 종료될 때 까지 존재
  

 * 전역 변수의 또 다른 특징
  - 같은 이름의 지역변수에 의해 가려지기도 한다.


 * static 변수
  - 함수 내부 및 외부에 선언
  - 한번만 초기화 된다 : 전역 변수의 특징
   : 이후에는 값의 재설정이 언제든 가능하다. (플래시와 동일)
  - 함수 내부에서 선언될 경우 함수 내에서만 접근이 가능하다 : 지역변수 특징
  - 선언된 함수가 종료되더라도 메모리 공간에 남아있는다.
   : 재호출 시 값이 재설정 되지 않고 연산이 가능하다.(2번과 동일)
  
  * 플래시와는 다르다(scope에 따라..)
   - 플래시에서는 함수와 변수는 class 내부에서만 선언가능
   - 플래시는 언제든 값의 재설정이 가능하다.
   - 어디서든 접근이 가능하다.


 * 레지스터 변수(register 기억장치) :  처리속도가 빠르다.
  - CPU안에 들어있는 메모리(register)공간을 사용한다.
  - 극히 제한된 메모리 공간이므로 여유롭지 않다.
   : 만약 full인경우 register는 생략되어진다.
  - 컴파일러의 성능에따라 자동으로 레지스터 등록기능을 지원한다.

Posted by 버터백통