로컬 변수

함수 안에서 선언된 변수는 로컬입니다. 로컬 변수의 범위는 선언된 함수 범위로 제한됩니다. 로컬 변수는 초기화 될 수 있습니다, 모든 표현식의 결과로써. 함수의 모든 호출은 로컬 변수를 초기화합니다. 로컬 변수는 해당 함수의 메모리 영역에 저장됩니다.

예제:

int somefunc()
  {
   int ret_code=0;
   ...
   return(ret_code);
  }

범위-변수의-는 변수를 참조할 수 있는 프로그램의 부분입니다. 내부 수준에서 블록 내부에 선언된 변수의 범위는 블록입니다. 블록 범위는 변수 선언으로 시작하여 마지막 오른쪽 꺽쇠로 끝납니다.

함수의 시작 부분에 선언된 로컬 변수에는 블록의 범위뿐만 아니라 로컬 변수인 함수 매개 변수도 있습니다. 모든 블록에는 변수 선언이 포함될 수 있습니다. 블록이 중첩되어 있고 외부 블록의 식별자가 내부 블록의 식별자와 이름이 같으면 내부 블록 작업이 끝날 때까지 외부 블록 식별자가 숨겨집니다.

예제:

void OnStart()
  {
//---
   int i=5;      // 함수의 지역 변수
     {
      int i=10;  // 함수의 변수
      Print("Inside block i = ",i); // 결과는  i=10;
    }
   Print("Outside block i = ",i);  // 결과는  i=5;
  }

즉, 내부 블록이 실행되는 동안 외부 블록에 동일한 이름의 식별자 값이 아니라 자체 로컬 식별자 값이 표시됩니다.

예제:

void OnStart()
  {
//---
   int i=5;      // 함수의 지역 변수
   for(int i=0;i<3;i++)
      Print("안에서 i = ",i);
   Print("블록 밖에서 i = ",i);
  }
/* 실행 결과
Inside for i = 0
Inside for i = 1
Inside for i = 2
블록 밖에서 i = 5
*/

정적 으로 선언된 로컬 변수는 프로그램 시작 이후 존재함에도 불구하고 블록의 범위를 가집니다.

Stack #

모든 MQL5 프로그램에서는 자동으로 생성된 로컬 함수 변수를 저장하기 위해 스택이라는 특수 메모리 영역이 할당됩니다. 스택 하나가 모든 기능에 할당되며 지표에 대한 그것의 기본 크기는 1Mb입니다. Expert Advisors 및 스크립트에서는 스택 크기를 #property stacksize 컴파일러 명령문(바이트 단위로 스택 크기를 설정)을 사용하여 스택 크기를 관리할 수 있으며, 기본적으로 스택에 8Mb의 메모리가 할당됩니다.

정적 로컬 변수는 다른 정적 & 글로벌 변수가 저장되는 동일한 위치(스택과는 별도로 존재하는 특수 메모리 영역)에 저장됩니다. 동적으로 생성된 변수도 스택과 별도의 메모리 영역을 사용합니다.

각 함수 호출을 통해 스택의 위치가 내부 비정적 변수에 할당됩니다. 기능을 종료하면 메모리를 다시 사용할 수 있습니다.

첫 번째 함수에서 두 번째 함수를 호출하면 두 번째 함수는 해당 변수에 대해 나머지 스택 메모리에서 필요한 크기를 차지합니다. 따라서 포함된 함수를 사용할 때 각 기능에 대해 스택 메모리가 순차적으로 사용됩니다. 이로 인해 함수 호출 중 하나에서 메모리가 부족해질 수 있으며, 이를 스택 오버플로라고 합니다.

따라서 대용량 로컬 데이터의 경우 동적 메모리를 사용하는 것이 좋습니다. 함수를 입력할 때는 로컬 요구에 필요한 메모리를 시스템(new, ArrayResize())에 할당하고 기능을 종료할 때는 메모리(delete, ArrayFree())를 해제합니다.

더 보기

데이터 유형, 유형의 캡슐화 및 확장성,변수 초기화, 가시성 범위 및 변수 수명, 개체 생성 및 삭제