seguro - ¿Cuándo necesitaría usar la palabra clave stackalloc en C#?
propiedad virtual c# (7)
¿Qué funcionalidad proporciona la palabra clave stackalloc
? ¿Cuándo y por qué querría usarlo?
Desde MSDN :
Se usa en un contexto de código inseguro para asignar un bloque de memoria en la pila.
Una de las características principales de C # es que normalmente no necesita acceder a la memoria directamente, como lo haría en C / C ++ usando malloc
o new
. Sin embargo, si realmente desea asignar explícitamente algo de memoria, puede hacerlo, pero C # lo considera "inseguro", por lo que solo puede hacerlo si compila con la configuración unsafe
. stackalloc
permite asignar dicha memoria.
Es casi seguro que no necesita usarlo para escribir código administrado. Es posible que, en algunos casos, pueda escribir un código más rápido si accede directamente a la memoria; básicamente, le permite utilizar la manipulación del puntero que se adapta a algunos problemas. A menos que tenga un problema específico y el código inseguro sea la única solución, entonces probablemente nunca lo necesitará.
Es como Steve señaló, solo se usa en el contexto de código no seguro (por ejemplo, cuando desea usar punteros).
Si no usa un código inseguro en su aplicación C #, entonces nunca lo necesitará.
La mayoría de las demás respuestas se centran en la parte de "qué funcionalidad" de la pregunta de OP.
Creo que esto responderá al cuándo y por qué:
¿Cuándo necesitas esto?
Para el mejor desempeño en el peor de los casos con la localidad de caché de múltiples arreglos pequeños.
Ahora, en una aplicación promedio, no necesitará esto, pero para escenarios sensibles en tiempo real ofrece un rendimiento más determinista: no hay GC involucrado y se le garantiza un éxito de caché.
(Debido a que el desempeño en el peor de los casos es más importante que el desempeño promedio).
¡Tenga en cuenta que el tamaño de pila predeterminado en .net es pequeño!
(Creo que es 1MB para aplicaciones normales y 256kb para ASP.net?)
El uso práctico podría incluir, por ejemplo, el procesamiento de sonido en tiempo real.
Pablo,
Como todos aquí han dicho, esa palabra clave dirige el tiempo de ejecución para asignar en la pila en lugar de la pila. Si está interesado en lo que esto significa exactamente, consulte este artículo .
Stackalloc asignará datos en la pila, que se pueden usar para evitar la basura que se generaría creando y destruyendo repetidamente matrices de tipos de valor dentro de un método.
public unsafe void DoSomeStuff()
{
byte* unmanaged = stackalloc byte[100];
byte[] managed = new byte[100];
//Do stuff with the arrays
//When this method exits, the unmanaged array gets immediately destroyed.
//The managed array no longer has any handles to it, so it will get
//cleaned up the next time the garbage collector runs.
//In the mean-time, it is still consuming memory and adding to the list of crap
//the garbage collector needs to keep track of. If you''re doing XNA dev on the
//Xbox 360, this can be especially bad.
}
stackalloc
dirige el tiempo de ejecución .net para asignar memoria en la pila.
esta palabra clave se utiliza para trabajar con la manipulación de memoria insegura. Al usarlo, tiene la capacidad de usar el puntero (una característica potente y dolorosa en C / C ++)