Aller au contenu

Span<T> réservé à la pile

Contexte : Span<T> est un type ref struct, ce qui signifie qu’il ne peut être alloué que sur la pile. Il ne peut pas être boxé, utilisé comme champ dans une classe, ou capturé dans une lambda asynchrone ou un itérateur. Cette restriction permet à Span<T> de fournir un accès mémoire sûr et haute performance sans surcharge du garbage collector.

using System;
public class StackOnlyDemo
{
public static void UseSpan()
{
Span<int> stackSpan = stackalloc int[10]; // allocation sur la pile
for (int i = 0; i < stackSpan.Length; i++)
{
stackSpan[i] = i;
}
// Ceci provoquerait une erreur de compilation :
// Task.Run(() => { Span<int> s = stackalloc int[5]; }); // Impossible de capturer un ref struct
}
}
Fenêtre de terminal
// La compilation réussit ; stackalloc est valide uniquement à l'intérieur de la méthode.
  • stackalloc alloue de la mémoire sur la pile, ce qui est très rapide mais de taille limitée.
  • Span<T> est idéal pour l’analyse et la transformation à faible allocation.

Lecteur JSON haute performance – Des bibliothèques comme Utf8JsonReader utilisent ReadOnlySpan<byte> pour analyser du JSON sans allouer de chaînes.
Voir documentation .NET sur stackalloc.