Compartilhar via


stackalloc (Referência de C#)

O stackalloc em um contexto de código não seguro, a palavra-chave é usada para alocar um bloco de memória na pilha.

int* block = stackalloc int[100];

Comentários

A palavra-chave é válida somente no inicializadores de variáveis locais. O código a seguir faz com que os erros do compilador.

int* block;
// The following assignment statement causes compiler errors. You
// can use stackalloc only when declaring and initializing a local 
// variable.
block = stackalloc int[100];

Porque os tipos de ponteiro estão envolvidos, stackalloc requer não seguros contexto. Para obter mais informações, consulte Código não seguro e ponteiros (Guia de Programação em C#).

stackallocé como _alloca na biblioteca de tempo de execução C.

O exemplo a seguir calcula e exibe os 20 primeiros números na seqüência de Fibonacci. Cada número é a soma dos dois números anteriores. No código, um bloco de memória de tamanho suficiente para conter 20 elementos do tipo int é alocada na pilha, não o heap. O endereço do bloco é armazenado no ponteiro fib. Essa memória não estará sujeito à coleta de lixo e, portanto, não precisa ser fixado (usando fixa). O tempo de vida do bloco de memória é limitado à vida útil do método que a define. Você não pode liberar a memória antes do método retorna.

Exemplo

class Test
{
    static unsafe void Main()
    {
        const int arraySize = 20;
        int* fib = stackalloc int[arraySize];
        int* p = fib;
        // The sequence begins with 1, 1.
        *p++ = *p++ = 1;
        for (int i = 2; i < arraySize; ++i, ++p)
        {
            // Sum the previous two numbers.
            *p = p[-1] + p[-2];
        }
        for (int i = 0; i < arraySize; ++i)
        {
            Console.WriteLine(fib[i]);
        }

        // Keep the console window open in debug mode.
        System.Console.WriteLine("Press any key to exit.");
        System.Console.ReadKey();
    }
}
/*
Output
1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765
*/

Segurança

Código não seguro é menos seguro do que as alternativas de seguras. No entanto, o uso de stackalloc automaticamente habilita recursos de detecção de saturação de buffer no common language runtime (CLR). Se for detectada uma saturação de buffer, o processo é encerrado assim que possível para minimizar a chance de que o código mal-intencionado seja executado.

Especificação da linguagem C#

Para obter mais informações, consulte a Especificação da linguagem C#. A especificação da linguagem é a fonte definitiva para a sintaxe e o uso de C#.

Consulte também

Referência

Palavras-chave C#

Palavras-chave de operador (Referência de C#)

Código não seguro e ponteiros (Guia de Programação em C#)

Conceitos

Guia de Programação em C#

Outros recursos

Referência de C#