C# Language stackalloc


Ejemplo

La palabra clave stackalloc crea una región de memoria en la pila y devuelve un puntero al inicio de esa memoria. La memoria asignada a la pila se elimina automáticamente cuando se sale del ámbito en el que se creó.

//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;
...

Utilizado en un contexto inseguro.

Al igual que con todos los punteros en C #, no hay límites de verificación en las lecturas y asignaciones. La lectura más allá de los límites de la memoria asignada tendrá resultados impredecibles: puede acceder a una ubicación arbitraria dentro de la memoria o puede causar una excepción de infracción de acceso.

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

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

La memoria asignada a la pila se elimina automáticamente cuando se sale del ámbito en el que se creó. Esto significa que nunca debe devolver la memoria creada con stackalloc o almacenarla más allá de la vida útil del alcance.

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 solo se puede utilizar al declarar e inicializar variables. Lo siguiente no es válido:

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

Observaciones:

stackalloc solo debe usarse para optimizaciones de rendimiento (ya sea para computación o interoperabilidad). Esto se debe al hecho de que:

  • El recolector de basura no es necesario ya que la memoria se asigna en la pila en lugar del montón, la memoria se libera tan pronto como la variable queda fuera del alcance
  • Es más rápido asignar memoria en la pila que en el montón
  • Aumente la posibilidad de que la memoria caché llegue a la CPU debido a la ubicación de los datos.