Variáveis Locais

Uma variável declarada dentro de uma função é local. O escopo de uma variável local é limitado a região dentro da função na qual a variável está declarada. Uma variável local pode ser inicializada pelo resultado de qualquer expressão. Toda chamada da função inicializa uma variável local. Variáveis locais são armazenadas na área de memória da correspondente função.

Exemplo:

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

Escopo de uma variável é uma parte de um programa, na qual uma variável pode ser referenciada. Variáveis declaradas dentro de um bloco (a nível interno), possuem o bloco como seu escopo. O escopo de bloco começa com a declaração da variável e termina com a chave direita final.

Variáveis locais declaradas no começo de uma função também têm escopo de bloco, bem como parâmetros de função, que são variáveis locais. Qualquer bloco pode conter declarações de variáveis. Se blocos estiverem aninhados e um identificador no bloco externo tiver o mesmo nome que um identificador no bloco interno, o identificador no bloco externo é oculto, até que a operação do bloco interno seja finalizado.

Exemplo:

void OnStart()
  {
//---
   int i=5;      // variável local da função
     {
      int i=10;  // variável de função
      Print("Dentro do bloco i = ",i); // resultado é i=10;
     }
   Print("Fora do bloco i = ",i);  // resultado é i=5;
  }

Isso significa que enquanto o bloco interno está rodando, ele vê os valores de seus próprios identificadores locais, e não os valores dos identificadores com nomes idênticos no bloco externo.

Exemplo:

void OnStart()
  {
//---
   int i=5;      // variável local da função
   for(int i=0;i<3;i++)
      Print("Dentro for i = ",i);
   Print("Fora do bloco i = ",i);
  }
/* Resultado da execução
Dentro for i = 0
Dentro for i = 1
Dentro for i = 2
Fora do bloco i = 5
*/

Variáveis locais declaradas como estáticas (static) têm escopo de bloco, apesar do fato de elas existirem desde o início do programa.

Pilha (Stack) #

Em todo programa MQL5, uma área especial de memória chamada pilha é alocada para armazenar variáveis locais de funções que são criadas automaticamente. Só uma pilha é alocada para todas as funções e, por padrão, seu tamanho é de 1 MB. Em Advisors e scripts, o tamanho da pilha pode ser gerenciado usando a diretiva de compilação #property stacksize (define o tamanho da pilha em bytes), por padrão, para eles são alocados 8MB.

Variáveis locais estáticas (static) são armazenadas no mesmo lugar onde outras variáveis estáticas e globais são armazenadas - em uma área especial de memória, que existe separadamente da pilha. Variáveis criadas dinamicamente também usam uma área de memória separada da pilha.

A cada chamada de função, um lugar na pilha é alocado para variáveis internas não estáticas. Após sair da função, a memória fica disponível para uso novamente.

Se da primeira função, uma segunda função for chamada, então a segunda função ocupa o tamanho requerido da memória restante da pilha para suas variáveis. Portanto, ao usar funções incluídas, a memória da pilha será seqüencialmente ocupada por cada função. Isso pode levar a uma falta de memória durante uma das chamadas de função, tal situação é chamada de estouro de pilha (stack overflow).

Portanto, para grandes dados é melhor usar memória dinâmica - ao entrar em uma função, aloque a memória que é requerida para as necessidades locais (new, ArrayResize()), e ao sair da função, libere a memória (delete, ArrayFree()).

Também Veja

Tipos de Dados, Encapsulamento e Extensibilidade de Tipos, Inicialização de Variáveis, Visibilidade Escopo e Tempo de Vida de Variáveis, Criando e Excluindo Objetos