C# Language pilealloc


Exemple

Le mot-clé stackalloc crée une région de mémoire sur la pile et renvoie un pointeur sur le début de cette mémoire. La mémoire allouée par pile est automatiquement supprimée lorsque la portée dans laquelle elle a été créée est fermée.

//Allocate 1024 bytes. This returns a pointer to the first byte.
byte* ptr = stackalloc byte[1024];

//Assign some values...
ptr[0] = 109;
ptr[1] = 13;
ptr[2] = 232;
...

Utilisé dans un contexte dangereux.

Comme avec tous les pointeurs en C #, il n'y a pas de limites à vérifier les lectures et les affectations. La lecture au-delà des limites de la mémoire allouée aura des résultats imprévisibles - elle peut accéder à un emplacement arbitraire dans la mémoire ou provoquer une exception de violation d'accès.

//Allocate 1 byte
byte* ptr = stackalloc byte[1];

//Unpredictable results...
ptr[10] = 1;
ptr[-1] = 2;

La mémoire allouée par pile est automatiquement supprimée lorsque la portée dans laquelle elle a été créée est fermée. Cela signifie que vous ne devez jamais renvoyer la mémoire créée avec stackalloc ou la stocker au-delà de la durée de vie de l'étendue.

unsafe IntPtr Leak() {
    //Allocate some memory on the stack
    var ptr = stackalloc byte[1024];

    //Return a pointer to that memory (this exits the scope of "Leak")
    return new IntPtr(ptr);
}

unsafe void Bad() {
     //ptr is now an invalid pointer, using it in any way will have
     //unpredictable results. This is exactly the same as accessing beyond
     //the bounds of the pointer.
     var ptr = Leak();
}

stackalloc ne peut être utilisé que lors de la déclaration et de l' initialisation de variables. Ce qui suit n'est pas valide:

byte* ptr;
...
ptr = stackalloc byte[1024];

Remarques:

stackalloc ne doit être utilisé que pour des optimisations de performances (pour le calcul ou l'interopérabilité). Cela est dû au fait que:

  • Le ramasse-miettes n'est pas nécessaire car la mémoire est allouée sur la pile plutôt que sur le tas - la mémoire est libérée dès que la variable est hors de portée
  • Il est plus rapide d'allouer de la mémoire sur la pile plutôt que sur le tas
  • Augmenter les chances de succès du cache sur le processeur en raison de la localisation des données