stackalloc (référence C#)
Le mot clé stackalloc est utilisé dans un contexte de code unsafe pour allouer un bloc de mémoire sur la pile.
int* block = stackalloc int[100];
Notes
Le mot clé est valide uniquement dans les initialiseurs de variable locale. Le code suivant génère des erreurs de compilation.
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];
Des types pointeur étant impliqués, stackalloc requiert un contexte unsafe. Pour plus d'informations, consultez Pointeurs et code unsafe (Guide de programmation C#).
stackalloc est similaire à _alloca dans la bibliothèque Runtime C.
L'exemple suivant calcule et affiche les 20 premiers numéros dans la séquence de Fibonacci. Chaque numéro est la somme des deux nombres précédents. Dans le code, un bloc de mémoire d'une taille suffisante pour contenir 20 éléments de type int est alloué sur la pile, et non sur le tas. L'adresse du bloc est stockée dans le pointeur fib. Cette mémoire ne fait pas l'objet de garbage collection et ne doit donc pas être épinglée (par le biais de fixed). La durée de vie du bloc de mémoire est limitée à la durée de vie de la méthode qui le définit. Vous ne pouvez pas libérer la mémoire avant le retour de la méthode.
Exemple
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
*/
Sécurité
Le code unsafe est moins sûr que les alternatives safe. Toutefois, l'utilisation de stackalloc active automatiquement les fonctionnalités de détection de dépassement de mémoire tampon dans le common language runtime (CLR). Si un dépassement de mémoire tampon est détecté, le processus est terminé aussi rapidement que possible, afin de réduire les risques d'exécution de code malveillant.
Spécification du langage C#
Pour plus d'informations, consultez la Spécification du langage C#. La spécification du langage est la source de référence pour la syntaxe C# et son utilisation.
Voir aussi
Référence
Mots clés des opérateurs (référence C#)
Pointeurs et code unsafe (Guide de programmation C#)